我们正在尝试使用LoadLibraryA函数从64位dll内部加载dll库。它返回126错误 - 未找到mod。给我们的函数的dll文件路径是正确的,我们确定。
我们已经尝试了一个虚拟dll进行测试,但是它已经加载了。
我们还尝试将dll(这是我们想要加载的第一个dll的依赖性)添加到虚拟dll。它也有效。所以问题似乎不是关于依赖dll,而是我们想要首先加载的原始dll。
我们也尝试将dl转换为64位,并尝试了,仍然没有好处。
我们还使用Dependency Walker检查了依赖关系。一切都很好。
我们使用的操作系统是Windows 8,64位。如果它有任何区别.. 有没有人对这个问题有任何想法?
编辑: 我们也试过这段代码:
hModule = LoadLibraryW(L"C:\\temp\\dllToLoad.dll");
并收到此错误代码:
"First-chance exception at 0x00000000 in C_Test_TSMPPKCS11.exe: 0xC0000005: Access violation at location 0x0000000000000000."
编辑2: 我们首先使用的代码是:
hModule = LoadLibraryA((char*)aDLLFile);
编辑3: 我们使用完整路径加载DLL。为了测试这个,我们尝试了这段代码:
FILE *fp;
int size = 0;
fp=fopen("C:\\temp\\dllToLoad.dll", "r");
size = fgetc(fp);
printf("size:%d\n",size);
fclose(fp);
没有问题,我们收到了77的文件大小。
答案 0 :(得分:5)
我们也尝试将dl转换为64位,并尝试了,仍然没有好处。
你无法将32位dll作为可执行代码加载到64位进程中(因为你正在使用LoadLibraryA(),这就是你可以尝试做的所有事情。)
假设您尝试加载的dll以及要加载的进程是相同的类型,那么您是将完整路径传递给LoadLibraryA()还是相对路径还是只是一个dll名称?如果您没有使用完整路径,请考虑使用LoadLibraryEx(),因为这样可以更好地控制所使用的搜索路径。如果您使用完整路径尝试使用普通文件操作打开文件,如果您无法加载DLL,这是否有效?如果可以,那么尝试使用LOAD_LIBRARY_AS_DATAFILE的LoadLibraryEX(),看看是否会将dll加载为一个简单的数据文件(证明它正在查找文件)。
运行Sysinternal's ProcMon并观察代码打开DLL,这可能会显示相关的DLL加载失败。