【发布时间】:2014-05-02 11:39:10
【问题描述】:
我遇到以下问题:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main() {
HANDLE handle;
DWORD dw;
handle = LoadLibrary("C:\\Folder\\mydll.dll");
dw = GetLastError();
printf("Loading Library: %d", dw);
FreeLibrary(handle);
return 0;
}
使用 Netbeans/MinGW 编译时,一切正常,DLL 已加载,输出为“Loading Library: 0”。
但是,当使用 Visual C++ 2008 Express 在完全相同的机器上编译完全相同的代码时,我得到了臭名昭著的 126 错误:“Loading Library: 126”。
DLL 显然存在于指定位置并且加载它也可以正常工作 - 当我将 Netbeans 与 MinGW 一起使用时。但是为什么用Visual C++就不行呢?
这只是概述我的问题的示例代码。它是一个更大的项目的一部分,在使用 Netbeans/MinGW 编译时可以正常工作,但在使用 Visual C++ 编译时不会加载 DLL...
感谢所有回答!
【问题讨论】:
-
mydll.dll可能依赖于使用 VC++ 加载时发现的其他 dll。尝试像 dependency walker 这样的工具,并确认所有依赖的 dll 都存在于%PATH%。 -
我已经尝试过了,Dependency Walker 确实向我展示了缺少几个 DLL:API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL API-MS-WIN-CORE- WINRT-ERROR-L1-1-0.DLL API-MS-WIN-CORE-WINRT-L1-1-0.DLL API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL API-MS -WIN-CORE-WINRT-STRING-L1-1-0.DLL API-MS-WIN-SHCORE-SCALING-L1-1-1.DLL DCOMP.DLL IESHIMS.DLL 但是为什么它与 Netbeans 一起工作呢?此外,我发现有人说 Dependency Walker 具有误导性的帖子:stackoverflow.com/questions/17023419/win-7-64-bit-dll-problems
-
那些可能在 Netbeans 等中可用。顺便说一句,你的 dll 名称是
"...\mydll.dll",而它应该是 "...\\mydll.dll",你缺少'\'。跨度> -
好的...刚刚检查了两个 .exe,VSC++ 文件为 30 kb,而 Netbeans 文件为 41 kb...所以我猜有一些链接正在进行。至于路径名,那是一个错字。我在这里发布 sn-p 时更改了它。在原始文件中,它是 \\mydll.dll。
-
请注意,操作系统不会在 DLL 所在的文件夹中搜索依赖的 DLL,而是在 EXE 所在的文件夹中(以及其他)。 This document 非常详细地描述了搜索过程,但无论如何,
C:\Folder一般不会被搜索到。我的猜测是,一个 EXE 可以工作,而另一个不仅仅是因为您以不同的方式运行它们 - 从不同的目录和/或使用不同的当前工作目录。星星恰好在一种情况下对齐,而在另一种情况下却没有对齐。
标签: c visual-c++ netbeans dll loadlibrary