我在我的应用程序中使用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:/ Program Files / My Application / ssleay32.dll
但是,在Windows 10 x64上它是
模块ssleay32.dll检测到路径= C:/ Program Files(x86)/ My Application / LibraryLocator.exe
其中LibraryLocator.exe是测试应用程序的名称,包含上面的代码
答案 0 :(得分:4)
GetModuleFileName()
在其hModule
参数设置为NULL时返回调用进程的路径。失败时LoadLibrary()
返回NULL。很明显,您对LoadLibrary()
的调用失败了(例如,如果您的32位EXE尝试加载64位版本的DLL,或者它无法在PATH
上找到DLL,那么没有指定绝对路径)。在调用GetModuleFileName()
之前,您没有处理错误。
如果Qt已经为您加载了DLL,那么您应该使用GetModuleHandle()
而不是LoadLibrary()
。
答案 1 :(得分:3)
似乎LoadLibrary
调用失败并返回NULL
,因为您从未检查返回值并将其直接传递给GetModuleFileName
,您获取调用可执行文件的路径。有一件事是你需要使用这些功能的广泛版本,例如LoadLibraryW
,否则在某些系统上可能会失败。