2013-11-15 42 views
0

我们正试图从使用LoadLibraryA函数的64位DLL中加载DLL库。它返回126错误 - mod找不到。我们确信,给函数的dll文件路径是正确的。使用LoadLibraryA 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

+2

如果您在这里没有得到有效的答案,请查阅“加载程序捕捉”,这是一种调试此类问题的机制。 – RichieHindle

+2

(小问题:'fgetc'从文件中获取一个字节;它没有得到大小,不是那个改变任何东西。) – RichieHindle

回答

5

我们也尝试了DL转换为64位,并试图那仍然不好。

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

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

运行起来Sysinternal's ProcMon并观察代码打开DLL,这可能会显示依赖DLL加载失败。

+0

嗨,我们正在使用完整的路径来加载dll文件。请检查编辑3. – lamostreta

+1

和DLL是x64? –

+0

这只是一个错误的陈述(第一句),给出了措辞。您可以*将32位DLL加载到64位进程中,反之亦然。正如你正确地指出'LOAD_LIBRARY_AS_DATAFILE'可以加载一个DLL来使用它的资源或者解析它或者你喜欢的任何东西。 – 0xC0000022L