使用 LoadLibraryA 的 dll 加载错误

dll loading error using LoadLibraryA

本文关键字:加载 错误 dll LoadLibraryA 使用      更新时间:2023-10-16

我们尝试使用 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:%dn",size);
    fclose(fp);

没有问题,我们收到的文件大小为77。

我们还尝试将 dl 转换为 64 位,并尝试过,仍然不好。

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

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

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