C++Builder 10.2迁移XE5项目时LoadLibrary加载DLL报错求助
迁移C++Builder XE5项目至10.2时的DLL加载问题解决
问题背景
将XE5 VCL项目迁移至C++Builder 10.2,新建工程添加原有源码和窗体后,编译时遇到DLL加载相关错误。
原代码与首次编译错误
原代码
extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices(); //load the library dynamically HINSTANCE load = LoadLibrary("SLABHIDDevice.dll");
编译报错
libloaderapi.h(648): candidate function not viable: no known conversion from 'const char [18]' to 'LPCWSTR' (aka 'const wchar_t *') for 1st argument
原因
C++Builder 10.2默认启用Unicode字符集,此时LoadLibrary会自动映射为宽字符版本LoadLibraryW,要求传入const wchar_t*类型参数;而XE5默认可能使用ANSI字符集,LoadLibrary映射为LoadLibraryA,接受窄字符const char*,因此原代码在XE5中正常,10.2中类型不匹配报错。
错误修改尝试的问题
修改后的代码:
extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices(); LPCWSTR a; *a = "SLABHIDDevice.dll"; HINSTANCE load = LoadLibrary(a);
报错信息
[bcc32c Error] worksurface.cpp(73): C++ requires a type specifier for all declarations
原因
LPCWSTR是const wchar_t*类型,a是未初始化的指针,直接解引用*a会导致未定义行为;"SLABHIDDevice.dll"是窄字符字面量,无法直接赋值给宽字符串指针,需要添加L前缀转为宽字符;- 语法错误:
*a = ...的写法完全错误,应为指针直接赋值,而非解引用赋值。
静态加载的问题
尝试静态加载的代码:
#pragma comment(lib, "SLABHIDDevice.dll") extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices();
链接报错
[ilink32 Error] Error: Error processing module (path)\SLABHIDDEVICE.DLL
原因
静态加载DLL需要对应的导入库(.lib文件),链接器无法直接处理DLL文件,必须使用配套的.lib导入库才能完成静态链接。
解决方案
动态加载(推荐,无需导入库)
有三种可行写法:
- 显式调用窄字符版本
LoadLibraryA,保持原代码风格:
extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices(); HINSTANCE load = LoadLibraryA("SLABHIDDevice.dll");
- 使用宽字符字面量,调用默认的Unicode版本
LoadLibrary:
extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices(); // 添加L前缀将字符串转为宽字符 HINSTANCE load = LoadLibrary(L"SLABHIDDevice.dll");
- 使用
_T宏兼容ANSI/Unicode字符集:
#include <tchar.h> extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices(); HINSTANCE load = LoadLibrary(_T("SLABHIDDevice.dll"));
静态加载(需导入库)
- 获取SLABHIDDevice.dll对应的
.lib导入库(通常由DLL提供方附带,若没有可通过工具生成); - 将
.lib文件放入项目目录,或添加到链接器的库搜索路径; - 修改代码:
#pragma comment(lib, "SLABHIDDevice.lib") extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices();
额外注意事项
- 确保DLL位数与项目编译目标一致(32位/64位),C++Builder 10.2默认编译32位程序,需对应32位DLL;
- 运行程序时,DLL需放在可执行文件目录或系统环境变量指定的路径中。
内容的提问来源于stack exchange,提问作者Buckethead
相关产品推荐
相关产品推荐

