我正在使用c#代码中的cpp COM对象。 我的c#代码如下所示:
try
{
var res = myComServer.GetSomething();
}
catch (Exception e) { }
但是异常永远不会包含我在cpp中设置的任何细节,特别是我的错误消息。
在我的cpp方面,我已经在网上找到了几个例子:
...
ICreateErrorInfo *pcerrinfo;
IErrorInfo *perrinfo;
HRESULT hr;
hr = CreateErrorInfo(&pcerrinfo);
pcerrinfo->SetDescription(L"C++ Exception");
hr = pcerrinfo->QueryInterface(IID_IErrorInfo, (LPVOID FAR*) &perrinfo);
if (SUCCEEDED(hr))
{
SetErrorInfo(0, perrinfo);
perrinfo->Release();
}
pcerrinfo->Release();
return E_FAIL; // E_FAIL or other appropriate failure code
...
我错过了什么吗? 是否还有其他任何可能影响这一点的内容,例如编组,互操作创建或com服务器本身的属性?
答案 0 :(得分:6)
您的COM类是否支持ISupportErrorInfo?
答案 1 :(得分:2)
假设您的类确实实现了ISupportErrorInfo
,您是否有机会在Visual Studio中添加支持 AFTER 将库导入您的C#项目?
导入库时,Visual Studio只生成一次与COM库通信所需的块。为此,它根据导入时DLL的TypeLib中可用的信息,构建一个名为“ originalDllName .Interop.dll”的特殊转换DLL。
您可以根据需要随时更改实施;但是如果您以任何方式更改了库(添加了新类,更改了接口定义,更改了类实现的接口......),则必须从References中删除COM DLL,然后重新导入它,用于刷新Interop DLL。
答案 2 :(得分:1)
我正面临着完全相同的问题。我已经在COM模块中实现了ISupportErrorInfo
和InterfaceSupportsErrorInfo
方法。不过,在C#异常中,我没有得到在C ++方面在perrorinfo
中设置的错误描述。就我而言,头文件中缺少COM_INTERFACE_ENTRY(ISupportErrorInfo)
条目。
答案 3 :(得分:-1)
不要捕捉Exception类型,而是抓住COMException这样的类型......
try
{
// COM call
}
catch( COMException cEx )
{
// Check HRESULT here
}