使用LoadLibraryA加载DLL错误

lam*_*eta 0 c++ dll loadlibrary

我们正在尝试使用LoadLibraryA函数从64位dll中加载一个dll库.它返回126错误 - 未找到mod.给我们的函数的dll文件路径是正确的,我们确定.

我们已经尝试了一个虚拟dll进行测试并且它有效,它已加载.

我们还尝试将dll(这是我们想要加载的第一个dll的依赖性)添加到虚拟dll.它也有效.所以问题似乎不是关于依赖dll,而是我们想要首先加载的原始dll.

我们也尝试将dl转换为64位,并尝试了,仍然没有好处.

我们还使用Dependency Walker检查了依赖关系.一切都好.

我们使用的操作系统是Windows 8,64bit.如果它有任何区别..有没有人对这个问题有任何想法?

编辑:我们也试过这段代码:

hModule = LoadLibraryW(L"C:\\temp\\dllToLoad.dll");
Run Code Online (Sandbox Code Playgroud)

并收到此错误代码:

"First-chance exception at 0x00000000 in C_Test_TSMPPKCS11.exe: 0xC0000005: Access violation at location 0x0000000000000000."
Run Code Online (Sandbox Code Playgroud)

编辑2:我们首先使用的代码是:

hModule = LoadLibraryA((char*)aDLLFile);
Run Code Online (Sandbox Code Playgroud)

编辑3:我们使用完整路径加载DLL.为了测试这个,我们尝试了这段代码:

FILE *fp;
    int size = 0;
    fp=fopen("C:\\temp\\dllToLoad.dll", "r");
    size = fgetc(fp);
    printf("size:%d\n",size);
    fclose(fp);
Run Code Online (Sandbox Code Playgroud)

没问题,我们收到的文件大小是77.

Len*_*ate 5

我们也尝试将dl转换为64位,并尝试了,仍然没有好处.

你无法将32位dll作为可执行代码加载到64位进程中(因为你正在使用LoadLibraryA(),这就是你可以尝试做的所有事情).

假设您尝试加载的DLL和您加载的进程是相同的类型,那么您是将完整路径传递给LoadLibraryA()或相对路径还是只是一个dll名称?如果您没有使用完整路径,请考虑使用LoadLibraryEx(),因为这样可以更好地控制所使用的搜索路径.如果您使用完整路径尝试使用普通文件操作打开文件,如果您无法加载DLL,这是否有效?如果可行,则尝试使用LOAD_LIBRARY_AS_DATAFILE的LoadLibraryEX(),看看是否会将dll作为简单数据文件加载(证明它正在查找文件).

运行Sysinternal的ProcMon并观察代码打开DLL,这可能会显示依赖DLL加载失败.