场景
- VS2010 sp1 安装完之后, 原来Debug模式下编译的Dll, 运行时EXE通过LoadLibrary加载这个Dll时, 返回 HMODULE 为NULL. 通过 GetLastError()返回错误值是87(参数错误). 之前没问题的代码在重装系统和重装VS2010后Debug编译运行错误.
分析
-
LoadLibrary只有一个unicode参数是DLL路径加载, 但是却报参数错误. 编译字符集也是用的UNICODE字符集, 系统也默认加了 _UNICODE 和 UNICODE 宏. 那么应该不是UNICODE路径问题. DLL的路径也是对的.
-
Release模式下能编译Dll. LoadLibrary Dll返回正常. EXE能正常运行.
-
全部代码完整清理编译一样这个错. 只能说明Debug模式下编译的Dll 某些地址加载错误.
-
解决办法参考
配置属性->链接器->启用增量链接-> 否(/INCREMENTAL:NO)
解决 LoadLibraryExA 、 LoadLibrary 参数错误 GetLastError()值87
/INCREMENTAL(增量链接)
增量链接的可执行 (.exe) 文件或动态链接库 (DLL):
-- 大于非增量链接的程序,因为有代码和数据的填充。 (填充允许链接器增加函数和数据的大小而不用重新创建 .exe 文件。)
-- 可以包含跳转 thunk 以处理函数重定位到新地址。
- 1
- 2
- 3
结论: 只有一个比较相近的解释就是Debug模式下的增量连接, 包含了一个thunk 以处理函数定位到新地址. 但是这种方式不适合显式加载vs2010的增量链接的Dll.
参考:
LoadLibrary fails on 64-bit application (error 87)
解决 LoadLibraryExA 、 LoadLibrary 参数错误 GetLastError()值87
/INCREMENTAL(增量链接)
LoadLibraryEx error 87 (The parameter is incorrect)