2011-02-15 72 views
4

我一直在尝试使用C++(从32位应用程序,在Windows 7 64位)加载32位dll。 LoadLibrary返回NULL,并且GetLastError返回126“找不到指定的模块”。LoadLibrary失败,模块未找到错误 - 可能的依赖关系问题

我将完整的地址传递给LoadLibrary函数。我打开了Dependency Walker中的dll,它说GPSVC.dll是一个缺失的依赖项。

从我做的Google搜索中看来,Dependency Walker经常将此GPSVC.dll错误地显示为缺失的依赖关系,并且没有它的32位版本,所以我不认为这就是实际问题。

我过去没有做过太多与dll的讨论,所以希望这是一个相对简单的问题,我可以从中学习。

在此先感谢您的帮助!

+1

一些附加信息:当我调用LoadLibrary时,Visual Studio调试器显示该DLL已加载,然后立即卸载。我相当肯定,这意味着dll被发现很好,但DllMain函数返回false。这似乎指向一个依赖性问题,但到目前为止,我还没有弄清楚任何问题。 – Ash 2011-02-15 22:22:00

回答

3

嗯,我解决我的问题,不幸的是这是一个相当明显的解决方案。我将包含我的dll的目录添加到PATH变量中。显然dll不会在他们自己的目录中查找它们的依赖关系。

+2

虽然有效,但并不安全。请参阅http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx上的“安全说明”。另请参阅http://msdn.microsoft.com/en-us/library/ms682586(v=VS.85).aspx。 – 2011-02-15 23:21:48

1

你能调试到其他DLL的DllMain?如果是的话,你可以直接在调试器中检查。借助Windbg,您可以在模块负载上突破,因此您可以单步执行所发生的任务。你直接链接到DLL的lib?如果没有,您可以尝试这样做来检查操作系统将向您显示的错误消息。如果它是0xC0000142,那么DllMain确实返回false。如果它是0xC0000022,则可执行文件或其中一个依赖dll不具有执行权限。你的代码126简直就是模块没有找到,似乎可以说明整个故事。您可以手动将PATH变量设置为该目录以找到缺失的dll的位置。 你是否将dll部署到其他机器?如果是,可能是因为您正在链接到 未在普通机器上安装的调试C-Runtime。

你的, 阿洛伊斯·克劳斯