Delphi:使用LoadLibrary加载DLL的奇怪行为

努诺皮卡多

我正在用Delphi构建一个插件系统(其中有些人一直在帮助我完成这项任务)。

要搜索DLL文件,我使用了TSearchRec,它在exe路径中搜索dll文件,然后使用LoadLibrary访问它们。然后,如果公开了某个功能(使用GetProcAddress),则将其作为插件加载。如果没有,则执行FreeLibrary,然后继续下一个文件。

在测试时,我注意到当TSearchRec找到恰好在该路径中的“ borlndmm.dll”时,它会加载并搜索我的插件函数(当然找不到),但是如果执行FreeLibrary,我会得到访问冲突。

相同路径中的其他无插件dll(如libmariadb.dll)将被安全释放,不会出现错误。

当然,通过将我的插件dll放在自己的路径中,而没有任何其他dll文件,可以轻松解决此问题,即使出于性能原因,这也会更好,因为它不必加载任何不该加载的库。

但我想了解为什么会这样。有任何想法吗?

谢谢努诺·皮卡多(Nuno Picado)

大卫·赫弗南(David Heffernan)

该DLL实现了共享内存管理器。它被设计为仅与加载时间链接一起使用。它由加载程序加载,直到进程结束才卸载。加载后,它将承担所有将来在进程中进行的堆分配和释放的责任。因此,它改变了主机进程的行为。无法动态加载。

这个故事的寓意是不要将随机DLL加载到您的进程中。仅加载您或您的程序用户明确要求加载的DLL。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TDictionary在Delphi中的奇怪行为

如何获取通过LoadLibrary()加载的DLL的内存使用情况?

使用绝对路径通过 LoadLibrary() 和 GetModuleHandle() 加载系统 DLL 是否更好地防止 DLL 劫持?

如何使用从Delphi DLL加载的窗体的应用程序图标

简单 Delphi 代码中的奇怪行为

Delphi TStream:创建时的奇怪行为

为什么 LoadLibrary 失败而 LoadLibraryA 成功加载 DLL?

Easyhook:如何从加载了 LoadLibrary 的 DLL 中挂钩函数

LoadLibrary 在运行时加载 dll 时返回 126

包含 ENUM 的 DLL 正在创建奇怪的行为

奇怪的UITableview重新加载动画行为

调用Delphi DLL的意外线程行为

奇怪的行为 UITableView 使用 viewWithTag

奇怪的行为,使用timeit + EXEC

使用 malloc 时的奇怪行为

如何使用realloc(奇怪的行为)

使用LoadLibrary打开dll进行分析是否安全?

Delphi-智能指针构造函数的奇怪行为

Delphi XE5-需要奇怪的行为帮助

向delphi中添加工具按钮时的奇怪行为

在构建将使用LoadLibrary加载的DLL时,我是否需要与相关二进制文件链接或是否包含头文件?

“找不到文件:VBA6.dll”错误-奇怪的行为

使用LoadLibrary在.pyd中发布加载cython cdef函数

什么变成了用Java加载System.loadLibrary()的.dll的搜索路径?

LoadLibrary vs加载二进制dll到进程中?

奇怪的Python ctypes行为。始终加载m(数学)库

在IOS的Webview中加载URL时的奇怪行为

Xcode 7 UITextView奇怪的行为导致视图加载失败

多次意外加载angularjs会导致奇怪的行为