获取模块文件名 Win 7/Win 10 上的不同行为
GetModuleFileName different behavior on Win 7/Win 10
我在我的应用程序中使用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
,否则在某些系统上可能会失败。
- 尝试导入pybind-opencv模块时出现libgtk错误
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 内联如何影响模块接口中的成员函数
- C++返回 Numpy 数组的 Python 扩展模块
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 如何从线程中的不同模块调用函数?
- 如何使用 soong 命名空间来有条件地编译模块
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- CMake - 模块 + 库混淆
- 特征 LLT 模块给出不正确的结果?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 python 模块中导入子模块时PyImport_Import失败
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 将 PCL 链接到 Cython C++ 模块
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 电源功能模块化操作
- 如何告诉本机节点模块所需的dll存储在哪里?
- 如何为模块化应用程序实现C++插件系统
- 获取模块文件名 Win 7/Win 10 上的不同行为