Error handling C++;生成器-程序结束错误和本地化错误 我对用ActuCabeRo C++ Builder做的程序有问题。

Error handling C++;生成器-程序结束错误和本地化错误 我对用ActuCabeRo C++ Builder做的程序有问题。,error-handling,localization,c++builder,Error Handling,Localization,C++builder,第一部分: 我想创建一个独立的.exe文件,根据这个文件,我禁用了“链接动态RTL”和“链接运行时包”。但是,每次我结束我的程序,我得到一个错误“异常程序终止”。我对此进行了调查,找到了部分解决方案。当我启用运行时包的链接时,错误不会出现,但是.exe文件不会在没有安装C++ Builder的PC上运行,因为一些BPL文件丢失了。所以,现在,我有两种可能:一种是“异常程序终止”错误,另一种是所有电脑都没有功能性的.exe文件。除了这个错误,我的程序工作得很好 第二部分: 我用3个单元制作了一个功

第一部分: 我想创建一个独立的.exe文件,根据这个文件,我禁用了“链接动态RTL”和“链接运行时包”。但是,每次我结束我的程序,我得到一个错误“异常程序终止”。我对此进行了调查,找到了部分解决方案。当我启用运行时包的链接时,错误不会出现,但是.exe文件不会在没有安装C++ Builder的PC上运行,因为一些BPL文件丢失了。所以,现在,我有两种可能:一种是“异常程序终止”错误,另一种是所有电脑都没有功能性的.exe文件。除了这个错误,我的程序工作得很好

第二部分: 我用3个单元制作了一个功能齐全的程序,我想用资源DLL向导用英语翻译它。我可以预览已翻译的表单,但无法构建它,因为它显示错误,但我看不到有关错误的更多详细信息。我真的不知道怎么可能有工作程序没有错误,本地化版本有错误。我得到的建议是先“全部清理”,然后“全部构建”,但由于这个错误,我甚至不能全部清理

我真的不知道该怎么办了,我已经为这些问题挣扎了一周,我真的希望有人能帮助我。谢谢:)

  • 本地化

    不确定您的本地化工具是否适用于Borland/Embarcadero应用程序(可能仅适用于MSVC++应用程序,这可能是问题所在)

    我自己做本地化(因为我需要自定义的东西,比如内部消息和表翻译。所以我编写了一个~55kbyte解析器,它将所有窗口的
    *.h、*.cpp、*.dfm
    作为输入,并创建
    *.ini
    文件和
    *.h
    ,读取所选语言的ini并将所有形式翻译成它(
    Caption,Hint,
    )然后仅针对每种新语言,我复制ini并翻译字符串。这样,我可以在运行时切换语言,而无需任何DLL,或者重新启动,客户可以自行添加新语言,而无需源代码或编程技能

    但是,无法共享代码,因为它使用我的一些不可共享(公司)LIB来访问字符串、动态列表和快速ini文件(它们包含在55 KB的估计值中),但我可以共享可执行文件(win32 standalone在BDS2006中编译,用于VCL BDS2006代码格式化):

    使用慢速下载(无需注册即可免费下载)。我甚至在公式中添加了一个用于测试的窗口。您只需运行exe,完成后使用输出中的文件。但是,输出的源文件使用快速ini文件访问(我无法共享),因此您需要对其进行编码(或替换为样式访问).这里是我的ini.h的基于winapi的解决方案,应该可以:

    \ifndef\u ini\u h
    #定义_ini_h
    类文件
    {
    公众:
    AnsiString节,文件名;
    //内联
    InFile(){close();}
    inifile(inifile&a){*this=a;}
    ~ini文件(){close();}
    inifile*运算符=(常量inifile*a){*this=*a;返回this;}
    //inifile*运算符=(常量inifile&a){…复制…返回此;}
    int open(AnsiString name)//打开ini文件
    {
    close();
    如果(FileExists(name)){filename=name;返回1;}
    返回0;
    }
    void close()//关闭ini文件
    {
    filename=“”;
    第“”节;
    }
    int sec_getid(const AnsiString&sec,bool _add)//选择要忽略返回ID的节
    {
    截面=秒;
    返回0;
    }
    AnsiString key\u get(int section\u id,const AnsiString&key,const AnsiString&def)//使用默认值从ini部分读取密钥
    {
    如果(文件名==“”)返回def;
    char dest[1024];AnsiString val;
    GetPrivateProfileString(section.c_str()、key.c_str()、def.c_str()、dest、1024、filename.c_str());
    val=dest;返回val;
    }
    };
    #恩迪夫
    
    因此,该应用程序有3个文件夹:

  • 公式集

    将表单的所有
    *.h、*.cpp;*.dfm
    文件放在此处。
    *.h
    的解析将在
    public:(跳过用户声明)
    上停止,以防止与用户代码冲突。您还可以在组件行末尾添加注释:

    //语言\u跳过\u CAPT
    //语言跳过文本
    //语言\u跳过\u提示
    
    或者任何阻止翻译的组合都会弄乱它

  • 消息

    忽略这一点,这适用于
    *。包含内部消息的cpp
    源文件
    \u要翻译的消息[]
    必须使用注释中的标记进行正确编码,如下所示:

    if (Form1->Visible) language_init(ExtractFilePath(Application->ExeName)+"english.ini");
    
    AnsiString\u消息[\u msg\u enum\u end+1]=
    {
    //语言\u MSG000\u文本\u BEG
    “错误:消息id超出范围!!!”,
    “缺少OpenGL FBO支持!!!…切换到简化图形”,
    “缺少OpenGL VBO支持!!!…切换到简化图形”,
    “抱歉:检测到ATI图形卡!!!…切换到简化图形”,
    “抱歉:检测到ATI Radeon HD 5450图形卡!!!…禁用预览功能”,
    “完成。”,
    //语言\u MSG000\u文本\u结束
    "",
    ""
    };
    
  • 输出

    这里的应用程序输出4个文件

    • init.h可以忽略这一点,它只是窗口状态的初始化/退出加载/行程
    • init.iniinit的ini文件可以忽略这一点 进入应用程序ini
    • 语言。h这是您想要的,这是翻译程序
    • english.ini使用当前窗口文本翻译ini文件
    这里是生成的
    语言.h
    的示例:

    #包括
    #包括“ini.h”//使用上面的ini.h
    void language_init(解析名称)
    {
    国际秒;
    ini文件ini;
    ini.open(名称);
    sec=ini.sec\u getid(“双编辑器