我正在用Delphi构建一个插件系统(其中有些人一直在帮助我完成这项任务)。
要搜索DLL文件,我使用了TSearchRec,它在exe路径中搜索dll文件,然后使用LoadLibrary访问它们。然后,如果公开了某个功能(使用GetProcAddress),则将其作为插件加载。如果没有,则执行FreeLibrary,然后继续下一个文件。
在测试时,我注意到当TSearchRec找到恰好在该路径中的“ borlndmm.dll”时,它会加载并搜索我的插件函数(当然找不到),但是如果执行FreeLibrary,我会得到访问冲突。
相同路径中的其他无插件dll(如libmariadb.dll)将被安全释放,不会出现错误。
当然,通过将我的插件dll放在自己的路径中,而没有任何其他dll文件,可以轻松解决此问题,即使出于性能原因,这也会更好,因为它不必加载任何不该加载的库。
但我想了解为什么会这样。有任何想法吗?
谢谢努诺·皮卡多(Nuno Picado)
该DLL实现了共享内存管理器。它被设计为仅与加载时间链接一起使用。它由加载程序加载,直到进程结束才卸载。加载后,它将承担所有将来在进程中进行的堆分配和释放的责任。因此,它改变了主机进程的行为。无法动态加载。
这个故事的寓意是不要将随机DLL加载到您的进程中。仅加载您或您的程序用户明确要求加载的DLL。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句