获取模块文件名 Win 7/Win 10 上的不同行为

GetModuleFileName different behavior on Win 7/Win 10

本文关键字:Win 模块 文件名 获取      更新时间:2023-10-16

我在我的应用程序中使用libeay32.dll/ssleay32.dll库来获得https支持。库已成功加载到 Windows 7 上(不是通过我的应用程序,而是通过 Qt 库(,但是我在 Windows 10 上收到 SSL 错误。

我编写了一个小应用程序来确保是否加载了正确的库实例(例如,不是从 PATH 加载(,并得到了有趣的结果。

这是代码

HMODULE hSsleay = LoadLibrary("ssleay32.dll");
DWORD pathSize = GetModuleFileName(hSsleay, ssleayPath, pathSize);
if (pathSize) {
    std::cout << "Module ssleay32.dll detected path = " << ssleayPath << 'n';
}
else {
    std::cout << "Module ssleay32.dll detection error LastError = " << GetLastError() << 'n';
}

Windows 7 x86 上的输出是

模块 ssleay32.dll检测到的路径 = C:/程序文件/我的应用程序/ssleay32.dll

但是,在Windows 10 x64上

它是

模块 ssleay32.dll检测到的路径 = C:/程序文件 (x86(/我的应用程序/库定位器.exe

其中 LibraryLocator.exe 是测试应用程序的名称,包含上面的代码

GetModuleFileName() 在其hModule参数设置为 NULL 时返回调用进程的路径。 LoadLibrary()失败时返回 NULL。很明显,您对 LoadLibrary() 的调用失败了(例如,如果您的 32 位 EXE 尝试加载 64 位版本的 DLL,或者由于您未指定绝对路径,因此无法在PATH上找到 DLL(。在调用 GetModuleFileName() 之前未处理错误。

如果Qt已经为你加载了DLL,你应该使用GetModuleHandle()而不是LoadLibrary()

似乎

LoadLibrary调用失败并返回NULL,因为您从不检查返回的值并将其直接传递给GetModuleFileName获取调用可执行文件的路径。没有什么是您需要使用这些函数的广泛版本,例如 LoadLibraryW,否则在某些系统上可能会失败。