C++ 为什么调用LoadLibrary会因';找不到指定的模块';第一次工作之后

C++ 为什么调用LoadLibrary会因';找不到指定的模块';第一次工作之后,c++,wcf,iis,com,loadlibrary,C++,Wcf,Iis,Com,Loadlibrary,我有一个在IIS7上作为WCF Web服务运行的应用程序。它调用一个COM控件,然后该控件加载另一个包含数据的dll。这个应用程序已经使用了相当长的一段时间,通常工作正常,但最近我在一台机器上遇到了一个问题,LoadLibrary调用加载数据dll失败。但是,调用并不总是失败的,它将在IIS服务重新启动后的第一次调用中工作,然后失败 数据dll与COM控件存在于同一目录中,当前目录设置为此目录。我已经检查过了,但当前目录没有设置为另一个目录,这两个调用都保持不变。单独的调用是对webservic

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

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

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

for LoadLIbrary说应该搜索当前目录,而所有其他使用此功能的安装似乎都表明它通常会这样做。出现故障的机器是Windows Server 2008 R2机器,尽管该应用程序以前已在此类机器上运行过多次

欢迎提出任何意见。有没有办法让LoadLibrary枚举它正在查找的位置

谢谢,

Jordan

我还没有找到一个可以枚举所有DLL搜索路径的函数,它看起来相当复杂:

Windows在当前工作目录中搜索库(以及.exe的位置)的行为是。这篇文章描述了一些排除进程中当前目录的方法,包括SetDllDirectory函数。我不知道IIS是如何工作的,但是如果你不控制这个过程,可能是其他人在篡改搜索设置?我想GetDllDirectory会告诉你这是否改变了


还有一种方法禁止搜索工作目录,但由于您的加载并不总是失败,我不得不猜测这不是原因。

您如何检查以确保当前目录一致?在两个调用之前,GETCurrutoDirectory的结果是打印消息?是的,我在C++代码中的LoadLibrary调用之前立即检查当前目录并打印消息,并且我同时检查了两个GETCWD和GETCurrTrand目录,它们都返回相同的东西……因为您知道它所在的目录,你能不能指定完整路径(作为一种解决方法)?是的,这就是我现在所做的,但我只是好奇是否有人知道它无法加载的原因。是的,我查看了它,你是对的,当调用GetDllDirectory时,第二次它被设置为其他内容。。。我不知道为什么(它似乎是一个oracle目录),但至少现在我知道了,这符合链接中提到的正确搜索顺序。谢谢