Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ /clr MFC应用程序中的异常处理(使用/EHa编译)_C++_Visual Studio_Exception Handling_Command Line Interface - Fatal编程技术网

C++ /clr MFC应用程序中的异常处理(使用/EHa编译)

C++ /clr MFC应用程序中的异常处理(使用/EHa编译),c++,visual-studio,exception-handling,command-line-interface,C++,Visual Studio,Exception Handling,Command Line Interface,我们有一个正在更新的大型MFC应用程序。它被修改为添加一些.NET组件(一些DLL现在有托管类和本机类),其想法是旧代码最终将被淘汰 应用程序有许多DLL,其中有本地C++类导出,并被应用程序使用。 在尝试测试应用程序时,我们现在发现任何异常似乎都会导致应用程序崩溃,即使理论上这些异常在同一个函数中被捕获 例如: CString AddressClass::GetPostalAddress() { CString address; try { address =

我们有一个正在更新的大型MFC应用程序。它被修改为添加一些.NET组件(一些DLL现在有托管类和本机类),其想法是旧代码最终将被淘汰

应用程序有许多DLL,其中有本地C++类导出,并被应用程序使用。 在尝试测试应用程序时,我们现在发现任何异常似乎都会导致应用程序崩溃,即使理论上这些异常在同一个函数中被捕获

例如:

CString AddressClass::GetPostalAddress()
{
    CString address;
    try {
        address = (LPCSTR)(_bstr_t)m_pCommand->GetParameters()->Item["PostalAddress"]->Value;
    }
    catch ( _com_error& )//exception occurs if postal address is NULL
    {
        address = _T("");
    }
    return address;
}
使用/clr和/EHa(Vs2015更新3)编译时未捕获_com_错误。在没有/clr的情况下,该系统运行良好,已运行多年。从我阅读的文档中,我的理解是这应该是可行的,但显然我错了

负责生成错误的代码位于comutil.h中:

inline void CheckError(HRESULT hr)
{
    if (FAILED(hr)) {
        _com_issue_error(hr);
    }
}
来自调试器的信息如下:

XXX.dll中发生“System.Runtime.InteropServices.SEHException”类型的异常,在托管/本机边界之前未处理该异常

其他信息:外部组件引发了异常

有没有办法在不重写大量代码的情况下让它正常工作


谢谢。

从简短评论中回答,因为它似乎有助于:


一般来说:您不应该使用/clr编译这些文件。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中将所有内容链接在一起

我们要做的是在单独的静态LIB项目中编译所有本机内容,然后将它们链接到启用/clr的项目中——在一个项目中为单个源文件使用单独的编译器开关总是有点混乱。但是,这可能仍然是你要走的路。我想这取决于混合和通话模式


我要补充的是,我认为/clr主要是一个相当强大的粘合系统,而不是整个应用程序堆栈的目标。

从简短的评论中回答,因为它似乎有帮助:


一般来说:您不应该使用/clr编译这些文件。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中将所有内容链接在一起

我们要做的是在单独的静态LIB项目中编译所有本机内容,然后将它们链接到启用/clr的项目中——在一个项目中为单个源文件使用单独的编译器开关总是有点混乱。但是,这可能仍然是你要走的路。我想这取决于混合和通话模式


我要补充的是,我认为/clr主要是一个功能相当强大的粘合系统,而不是整个应用程序堆栈的目标。

一般来说:不应该使用/clr编译它们。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中链接所有内容。感谢您的反馈,我相信您是正确的。这是我应该知道的吗?我花了很多时间寻找这个解决方案。我应该知道吗?我敢说不是。这是我个人在几次迭代后才“得到”的东西。就我个人而言,我只将/clr用于粘合代码,但您的情况似乎稍微复杂一些。使用code将旧代码与新CLR分开,只需使用/CLR编译新代码,直接编译旧代码/文件。您仍然可以在启用clr的DLL中链接所有内容。感谢您的反馈,我相信您是正确的。这是我应该知道的吗?我花了很多时间寻找这个解决方案。我应该知道吗?我敢说不是。这是我个人在几次迭代后才“得到”的东西。就我个人而言,我只在胶水代码中使用/clr,但您的情况似乎稍微复杂一些。