2

我有一个在 IIS7 上作为 WCF Web 服务运行的应用程序。它调用一个 COM 控件,然后该控件加载另一个带有数据的 dll。这个应用程序已经使用了很长一段时间并且正常工作,但最近我在一台机器上遇到了一个问题,其中 LoadLibrary 调用加载数据 dll 失败。但是,调用并不总是失败,它会在 IIS 服务重新启动后的第一次调用中起作用,然后再失败。

数据dll与COM控件存在同一目录下,当前目录设置为该目录。我已经检查过,当前目录没有设置为另一个目录,两个调用都保持不变。单独的调用是对 web 服务的单独调用,在它们之间,com 控件被卸载,数据 dll 也是如此。

如果我将数据 dll 放在系统目录中或使用 com 目录中 dll 的完整路径,则数据 dll 加载正常,所以我可以解决这个问题,但我只是想知道为什么会发生这种情况。当我在加载模块失败后调用 GetLastError 时,正如我所提到的,它只会给我“找不到指定的模块”错误。

LoadLIbrary的MSDN 描述说,应该搜索当前目录,并且所有其他安装它的地方似乎都表明它通常会这样做。它发生故障的机器是 Windows Server 2008 R2 机器,尽管该应用程序之前已经在这种类型的机器上运行过很多次。

欢迎任何想法。有没有办法让 LoadLibrary 枚举它在哪里寻找?

谢谢,
乔丹

4

1 回答 1

2

我还没有找到一个可以枚举所有 DLL 搜索路径的函数,它看起来相当复杂:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85% 29.aspx

Windows 在当前工作目录中搜索库的行为(除了 .exe 的位置)被认为是潜在的安全漏洞。那篇文章描述了一些在进程中排除当前目录的方法,包括 SetDllDirectory 函数。我不知道 IIS 是如何工作的,但如果你不控制进程,也许其他人正在篡改搜索设置?我认为 GetDllDirectory 会告诉你是否改变了。

还有一个全局注册表设置禁用搜索工作目录,但由于您的加载并不总是失败,我不得不猜测这不是原因。

于 2012-04-21T02:06:04.563 回答