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

C++ Builder XE3中含AnsiString的DLL导致LoadLibrary加载失败求助

解决C++ Builder XE3主程序加载含AnsiString的DLL异常问题

针对你遇到的Error 126/1114异常,核心原因是C++ Builder版本间RTL(运行时库)不兼容,以及跨模块传递VCL类型导致的内存管理冲突,以下是具体解决思路:

1. 统一RTL版本与链接模式

  • 必须要求用户DLL和主程序使用**同一版本的C++ Builder(XE3)**编译,不同版本的RTL对AnsiString的内部实现、内存管理逻辑差异极大,2007编译的DLL能正常工作只是旧版RTL的兼容性遗留。
  • 强制主程序和所有用户DLL都启用动态链接RTL:打开项目选项(Project Options)→ Linker → 勾选"Use dynamic RTL"。这样所有模块共享同一个RTL实例,避免跨模块传递AnsiString时因内存上下文不一致触发1114错误。

2. 替换跨模块传递的VCL类型

AnsiString是VCL封装的非标准类型,跨DLL传递依赖RTL强绑定,建议改用标准C类型替代:

  • 主程序调用端代码修改:
    HINSTANCE FDLLHandle = LoadLibrary("Test.dll");
    if(FDLLHandle)
    {
        typedef void (*OnLoadFunc)(const char*);
        OnLoadFunc func = (OnLoadFunc)GetProcAddress(FDLLHandle, "OnLoad");
        if(func)
        {
            AnsiString text = "test content";
            func(text.c_str());
        }
        FreeLibrary(FDLLHandle);
    }
    
  • DLL导出函数修改:
    #pragma hdrstop
    #pragma argsused
    
    #include <vcl.h>
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        return TRUE;
    }
    
    extern "C" __declspec(dllexport) void OnLoad(const char* text)
    {
        AnsiString str(text);
        // 原逻辑处理
    }
    

如果必须使用字符串类,可考虑COM标准的BSTR类型,避免依赖VCL/RTL。

3. 排查DLL依赖项解决Error 126

Error 126本质是DLL缺失依赖库:

  • 用Dependency Walker工具打开XE3编译的Test.dll,检查是否缺失XE3专属的BPL库(如rtl170.bpl、vcl170.bpl等)。
  • 将这些依赖的BPL文件和主程序、DLL放在同一目录,或添加到系统环境变量的PATH路径中。

4. 统一字符集设置

确保主程序和DLL的字符集配置一致:打开项目选项→ General → Character Set,统一设置为"Ansi"(匹配AnsiString的使用场景),避免因字符集差异导致的类型解析错误。

5. 修正DLL入口函数实现

示例中的_libmain不是Windows标准DLL入口,建议替换为标准DllMain函数,确保DLL初始化逻辑符合系统规范,减少潜在的加载异常。

内容的提问来源于stack exchange,提问作者showl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:03:17