c++ - 为什么第一次工作后调用 LoadLibrary 会失败并显示 'The specified module could not be found'

标签 c++ wcf iis com loadlibrary

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

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

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

MSDN description对于 LoadLIbrary 来说,应该搜索当前目录,并且所有其他安装过的安装似乎都表明它通常是这样的。发生故障的计算机是 Windows Server 2008 R2 计算机,尽管该应用程序之前已在此类计算机上运行过多次。

欢迎任何想法。有没有办法让 LoadLibrary 枚举它正在查找的位置?

谢谢,
乔丹

最佳答案

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

在当前工作目录中搜索库(除了 .exe 的位置)的 Windows 行为是 considered a potential security flaw 。该文章介绍了在进程中排除当前目录的一些方法,包括 SetDllDirectory 函数。我不知道IIS是如何工作的,但是如果你不控制该进程,也许其他人正在篡改搜索设置?我认为 GetDllDirectory 会告诉您是否发生了变化。

还有一个global registry setting这会禁用搜索工作目录,但由于您的加载并不总是失败,我不得不猜测这不是原因。

关于c++ - 为什么第一次工作后调用 LoadLibrary 会失败并显示 'The specified module could not be found',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10255055/

相关文章:

c++ - std::apply-ing sscanf 到元组中,元组未完全更新

c++ - MediaElement捕获麦克风并修改数据

wcf - WCF 服务与 MVC WebAPI 的性能问题

wcf - 有没有你? WCF 服务考虑。使用 WCF 还是直接访问?

c# - 捕获 WCF 超时异常

asp.net - 在与 Sharepoint 相同的网站中部署 ASP.NET 应用程序

c++ - 你如何为 clang 和 gcc 编写一个 makefile?

c++ - 宏中的静态变量

visual-studio-2008 - 我无法再使用 visual studio 2008 调试经典的 asp 代码

asp.net-mvc - 通过代码请求客户端证书