【发布时间】:2014-02-06 23:05:48
【问题描述】:
我正在使用 Delphi 构建一个插件系统(你们中的一些人一直在帮助我完成这项任务)。
为了搜索 DLL 文件,我使用了 TSearchRec,它在 exe 路径中搜索 dll 文件,然后我使用 LoadLibrary 来访问它们。 然后,如果某个函数被公开(使用 GetProcAddress),我将它作为插件加载。如果不是,则执行 FreeLibrary,并继续执行下一个文件。
在测试时,我注意到当 TSearchRec 找到恰好在该路径中的“borlndmm.dll”时,它会加载并搜索我的插件函数,当然没有找到,但是当 if 执行 FreeLibrary ,我遇到访问冲突。
同一路径中的其他无插件 dll,例如 libmariadb.dll,可以安全地释放而不会出错。
当然,这很容易解决,方法是将我的插件 dll 放在自己的路径中,没有任何其他 dll 文件,即使出于性能原因,这也会更好,因为它不必加载任何不应该加载的库.
但我想了解它为什么会发生。 有什么想法吗?
谢谢 努诺·皮卡多
【问题讨论】:
-
不要将随机 DLLS 加载到您的进程中。真是个坏主意。
-
如果您创建一个测试应用程序,除了在
borlndmm.dll上调用LoadLibrary,然后调用FreeLibrary,这还会发生吗?如果是这样,请发布使用的代码。如果不是,这是一个与您的应用程序本身隔离的问题。 (我同意@DavidHeffernan,顺便说一句;将随机 DLL 加载到您的进程中是一个糟糕的主意。) -
谢谢大卫和肯。我会听从这个建议的!
-
我做过一个非常相似的项目,几乎完全按照您的描述进行。我避免加载不应该加载的 DLL 的方法是给它们一个唯一的文件扩展名。这样,您只能搜索具有您决定为其提供的任何唯一扩展名的文件。这些文件也应该位于它们自己的文件夹中 - 不与您的其他程序文件混合,而是在子文件夹中。
-
只是一个警告,在没有 100% 确定您可以控制内容的情况下,永远不要加载 DLL。这是病毒或恶意软件在计算机上启动和运行的最简单方法之一。我会添加一个配置文件,指定包含哪些 DLL,然后按照 Jerry 的建议更改名称,然后还包含某种签名以确保它是您的 DLL。
标签: delphi dll access-violation