使用LoadLibraryA加载DLL错误

时间:2013-11-15 12:51:52

标签: c++ dll loadlibrary

我们正在尝试使用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的文件大小。

1 个答案:

答案 0 :(得分:5)

  

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

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

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

运行Sysinternal's ProcMon并观察代码打开DLL,这可能会显示相关的DLL加载失败。