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.
我们也尝试将dl转换为64位,并尝试了,仍然没有好处.
你无法将32位dll作为可执行代码加载到64位进程中(因为你正在使用LoadLibraryA(),这就是你可以尝试做的所有事情).
假设您尝试加载的DLL和您加载的进程是相同的类型,那么您是将完整路径传递给LoadLibraryA()或相对路径还是只是一个dll名称?如果您没有使用完整路径,请考虑使用LoadLibraryEx(),因为这样可以更好地控制所使用的搜索路径.如果您使用完整路径尝试使用普通文件操作打开文件,如果您无法加载DLL,这是否有效?如果可行,则尝试使用LOAD_LIBRARY_AS_DATAFILE的LoadLibraryEX(),看看是否会将dll作为简单数据文件加载(证明它正在查找文件).
运行Sysinternal的ProcMon并观察代码打开DLL,这可能会显示依赖DLL加载失败.
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |