我正在使用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服务器本身的属性吗?
您的COM类是否支持ISupportErrorInfo?
假设您的类确实实现了ISupportErrorInfo
,您是否有任何机会添加了支持[[AFTER从Visual Studio将库导入到C#项目中?
originalDllName
。Interop.dll”的特殊转换DLL。您可以根据需要多次更改实现而不会遇到麻烦;但是如果您以任何方式更改了库(添加了新类,更改了接口定义,更改了由类实现的Iterfaces ...),则必须从引用中删除COM DLL,然后重新导入它,用于刷新Interop DLL。try
{
// COM call
}
catch( COMException cEx )
{
// Check HRESULT here
}