我在执行 64 位版本的程序时遇到问题:
_XMLDoc = new TBasicXML(_owner);
try {
_XMLDoc->LoadFromFile(_filePath);
}
catch (...) {
delete _XMLDoc;
return "?";
}
在32 位版本中,当 _filePath 不存在时,程序进入 catch 块,但在64 位版本中则不存在。实际上,它会抛出 EDOMParseError 几次,并且在我为每个错误对话框按 continue 后进入 catch 块。
TBasicXML 类构造函数是:
__fastcall TBasicXML::TBasicXML(TComponent *Owner, UnicodeString encoding)
{
_doc = new TXMLDocument(Owner);
_doc->Active = true;
_doc->Encoding = encoding;
_doc->Options = TXMLDocOptions()<<doNodeAutoIndent;
}
为了避免这种行为,我是否需要在 Win 64 目标的项目选项中特别指定某些东西,以防止这种行为?
编辑:我专注于这部分代码(解析器),因为它是在程序启动时执行的。但是,在解析器调用之前,我在主窗体的构造函数中添加了这种代码和平:
int x;
try {
x = StrToInt("not a number");
}
catch (...) {
MessageDlg("Exception catched!", mtInformation, TMsgDlgButtons() << mbOK, 0);
}
我已经构建了 64 位发布版本并启动了程序(无需调试器运行)。它只是在没有任何消息的情况下中止。当使用调试器(运行(F9))启动相同的程序(发布)时,它会显示错误消息对话框(EConverterError),然后在按下继续后它会显示我的 MessageDlg。
注意:32位版本完全没有问题。
Edit2:我测试了其他一些项目,情况相同:
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
// test
int x;
try {
x = StrToInt("not a number");
}
catch (...) {
MessageDlg("Exception catched!", mtInformation, TMsgDlgButtons() << mbOK, 0);
}
//Ie settings
IEGlobalSettings()->AutoFragmentBitmap = false;
IEGlobalSettings()->MsgLanguage = msEnglish;
IEGlobalSettings()->EnableTheming = true;
// initialize spengine
speInit(); // delayed DLL load
FLeftId = 0;
FRightId = 0;
}
同样,64 位发行版,当从 IDE 启动时,没有调试器,静默终止程序,当使用调试器启动时,正常工作。
Edit3:现在,这是一个谜?在上面的示例中,我从构建中排除了 DLL 库 (spEngine.a),并注释了与 DLL 条目调用相关的所有代码,并且 try-catch 块照常工作。当包含 spEngine.a 时,无论 DLL 加载 (spEngine.dll) 是否延迟,也没有对 DLL 条目的任何调用,try-catch 块如前所述。很奇怪。spEngine.dll 使用 MVSC2017 调用自定义 Intel 的 ipp DLL 构建。我在另一个调用 OpenCV DLL(使用 MSVC2017 构建的包装器)的库中遇到了类似的 try-catch 行为。完整的源代码在这里:https ://github.com/spetric/Lips
注意:64 位主机应用程序运行良好,功能没有问题,只有奇怪的 try-catch 块行为。