You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因

  1. LPCWSTR是const wchar_t*类型,a是未初始化的指针,直接解引用*a会导致未定义行为;
  2. "SLABHIDDevice.dll"是窄字符字面量,无法直接赋值给宽字符串指针,需要添加L前缀转为宽字符;
  3. 语法错误:*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导入库才能完成静态链接。

解决方案

动态加载(推荐,无需导入库)

有三种可行写法:

  1. 显式调用窄字符版本LoadLibraryA,保持原代码风格:
extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices();
HINSTANCE load = LoadLibraryA("SLABHIDDevice.dll");
  1. 使用宽字符字面量,调用默认的Unicode版本LoadLibrary:
extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices();
// 添加L前缀将字符串转为宽字符
HINSTANCE load = LoadLibrary(L"SLABHIDDevice.dll");
  1. 使用_T宏兼容ANSI/Unicode字符集:
#include <tchar.h>
extern "C++" __declspec(dllimport) HID_SMBUS_STATUS HidSmbus_GetNumDevices();
HINSTANCE load = LoadLibrary(_T("SLABHIDDevice.dll"));

静态加载(需导入库)

  1. 获取SLABHIDDevice.dll对应的.lib导入库(通常由DLL提供方附带,若没有可通过工具生成);
  2. 将.lib文件放入项目目录,或添加到链接器的库搜索路径;
  3. 修改代码:
#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:10:34