LoadLibrary("dllname.dll")出错

本文记录了一次将VC++工程中的编码模块编译为DLL供PHP调用的过程。遇到LoadLibrary函数返回错误代码126的问题,经过排查,最终发现是由于默认使用Unicode字符集导致的加载失败,通过修改字符串参数的字符集解决了问题。

最近想把一个已经存在的VC++工程里面的某个编码模块编译成DLL供PHP调用,编译好DLL之后,用LoadLibrary函数调用,结果返回错误代码:126,加载失败,然后开始寻找原因,主要从以下几个方面尝试:

1) 路径不对,于是把DLL文件拷贝到工程所有的目录里,依然错误;换成绝对路径,依然错误;看来不是路径的问题!
2) 编译的DLL文件有问题?那就用VS自带的命令行工具检查一下,使用的命令是:dumpbin -exports dllname.dll,结果发现是好的,看来DLL文件也没问题!
3) 在网上还看到一个可能,就是DLL依赖项没有一起拷过去,细想应该不是,原因有二:其一,我新建的很简单的DLL工程,没有任何依赖项的DLL都不行;其二就是使用的绝对路径;
4) 柳暗花明,偶然看到了一个说法,loadlibrary的字符串参数也就是DLL路径可以改为多字符集,因为默认的是Unicode字符集,试了一下,居然成功了!如图:

这里写图片描述

警告: 解析过程中生成了警告消息。请检查要用于更正的函数。使用以下代码可以查看警告文本: [notfound,warnings]=loadlibrary(...) > 位置:loadlibrary 位置: test (第 8 行) 加载随后的库中间输出时出错。 实际错误位于此输出末尾。 ********* Locale 'Chinese (Simplified)_China.936' is unsupported, and may crash the interpreter. Type 'intclassCThostFtdcMdApi{public:staticCThostFtdcMdApiPtr' was not found. Defaulting to type voidPtr. Found on line 20764 of input from line 166 of file C:\\Users\\zhaoh\\Desktop\\20250422_traderapi64_se_windows\\ThostFtdcMdApi.h Failed to parse type 'char * pszFlowPath = ""' original input 'const char * pszFlowPath = ""' Found on line 20764 of input from line 166 of file C:\\Users\\zhaoh\\Desktop\\20250422_traderapi64_se_windows\\ThostFtdcMdApi.h Error parsing argument for function CreateFtdcMdApi function may be invalid. Failed to parse type 'bool bIsUsingUdp = false' original input ' const bool bIsUsingUdp = false ' Found on line 20764 of input from line 166 of file C:\\Users\\zhaoh\\Desktop\\20250422_traderapi64_se_windows\\ThostFtdcMdApi.h Error parsing argument for function CreateFtdcMdApi function may be invalid. Failed to parse type 'bool bIsMulticast = false' original input ' const bool bIsMulticast = false ' Found on line 20764 of input from line 166 of file C:\\Users\\zhaoh\\Desktop\\20250422_traderapi64_se_windows\\ThostFtdcMdApi.h Error parsing argument for function CreateFtdcMdApi function may be invalid. ********* 错误使用 loadlibrary 生成 ThostMdApiLib_thunk_pcwin64 失败。编译器输出为: cl -I"C:\Program Files\MATLAB\R2024b\extern\include" /Zc:__cplusplus /Zp8 /W3 /nologo -I"C:\Users\zhaoh\Desktop\20250422_traderapi64_se_windows" -I"C:\Users\zhaoh\Desktop\20250422_traderapi64_se_windows" "ThostMdApiLib_thunk_pcwin64.c" -LD -Fe"ThostMdApiLib_thunk_pcwin64.dll" ThostMdApiLib_thunk_pcwin64.c C:\Users\zhaoh\Desktop\20250422_traderapi64_se_windows\ThostFtdcMdApi.h(29): error C2061: 语法错误: 标识符“CThostFtdcMdSpi” C:\Users\zhaoh\Desktop\20250422_traderapi64_se_windows\ThostFtdcMdApi.h(29): error C2059: 语法错误:“;” C:\Users\zhaoh\Desktop\20250422_traderapi64_se_windows\ThostFtdcMdApi.h(30): error C2449: 在文件范围内找到“{”(是否缺少函数头?) C:\Users\zhaoh\Desktop\20250422_traderapi64_se_windows\ThostFtdcMdApi.h(78): error C2059: 语法错误:“}” ThostMdApiLib_thunk_pcwin64.c(33): error C2143: 语法错误: 缺少“{”(在“*”的前面) ThostMdApiLib_thunk_pcwin64.c(33): warning C4133: “初始化”: 从“char [1]”到“int *”的类型不兼容 ThostMdApiLib_thunk_pcwin64.c(33): error C2146: 语法错误: 缺少“;”(在标识符“boolbIsUsingUdp”的前面) ThostMdApiLib_thunk_pcwin64.c(33): error C2065: “falseboolbIsMulticast”: 未声明的标识符 ThostMdApiLib_thunk_pcwin64.c(33): warning C4013: “falseThunk”未定义;假设外部返回 int ThostMdApiLib_thunk_pcwin64.c(33): error C2143: 语法错误: 缺少“)”(在“类型”的前面) ThostMdApiLib_thunk_pcwin64.c(33): error C2099: 初始值设定项不是常量 出错 test (第 8 行) loadlibrary(dllName, headerFile, 'alias', aliasName); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
最新发布
08-29
错误114(ERROR_BAD_EXE_FORMAT)通常表明尝试加载的DLL文件与其运行的平台不兼容,比如32位与64位系统之间的不匹配。在加载`ppocr.dll`时遇到此问题,可能的原因及解决方案如下: 1. **检查DLL与系统的架构兼容性**:确保`ppocr.dll`的架构(32位或64位)与运行它的Windows操作系统版本相匹配。如果操作系统是64位的,而DLL是32位的,则需要确保应用程序是以32位模式运行的[^1]。 2. **验证依赖项**:使用工具如Dependency Walker检查`ppocr.dll`是否有缺失或损坏的依赖项。此工具可以帮助识别DLL加载失败的具体原因[^1]。 3. **检查文件完整性**:确认`ppocr.dll`文件未损坏。可以通过重新下载或从官方源获取最新的DLL文件来实现[^1]。 4. **权限问题**:确保运行的应用程序有足够的权限访问和加载`ppocr.dll`。有时候,文件或目录的权限设置可能会阻止程序正常访问文件[^1]。 5. **兼容性模式**:尝试以兼容模式运行应用程序,特别是当应用程序或DLL是为旧版本的Windows设计时。可以通过右键点击应用程序,选择“属性”,然后在“兼容性”标签下调整设置[^1]。 6. **更新操作系统**:有时,操作系统缺少必要的更新也可能导致此类问题。确保Windows系统是最新的,安装了所有最新的服务包和更新[^1]。 7. **检查病毒或恶意软件**:运行反病毒扫描,确保`ppocr.dll`文件没有被病毒或恶意软件篡改[^1]。 8. **重新注册DLL**:尽管对于错误114这可能不是直接的解决方案,但可以尝试使用`regsvr32.exe`命令重新注册`ppocr.dll`。打开命令提示符,输入`regsvr32.exe ppocr.dll`并执行[^1]。 如果上述方法都不能解决问题,可能需要联系`ppocr.dll`的提供者或开发者寻求进一步的技术支持。 ```cpp // 示例代码:如何使用LoadLibrary加载DLL #include <windows.h> #include <iostream> int main() { HMODULE hModule = LoadLibrary(TEXT("ppocr.dll")); if (hModule != NULL) { std::cout << "DLL loaded successfully." << std::endl; FreeLibrary(hModule); } else { std::cerr << "Failed to load DLL. Error code: " << GetLastError() << std::endl; } return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值