4
我需要从COM一个RECT至C#64位,所以我在IDL定义的简单方法为:如何通过RECT在COM
[id(23), helpstring("method GetRect")] HRESULT GetRect([out,retval] RECT* pRect);
和在C++作为
STDMETHODIMP CSpot::GetRect(RECT* pRect)
{
CRect rec = get_position();
*pRect = rec;
return S_OK;
}
实现
我叫C#为:
tagRECT rec = pSpot.GetRect();
大多数时间是确定的,但有时我得到0000005:访问冲突写入位置0x0000000000000000。
在行:
*pRect = rec;
什么会导致此异常?
如何使用''tagRECT REC = pSpot.GetRect ();''当medhod如果定义为''GetRect(RECT * pRect)''?你不应该使用''pSpot.GetRect(rec)''? – fogbit 2013-05-14 07:45:30
@fogbit - 不,一切都是正确的。高级别的COM包装,包括'RCW',通常会检查HRESULT返回,以便为非'S_OK'结果生成异常。标记为'[retval]'的参数成为这种包装方法的返回值。这里的实际问题是,封装器_sometimes_将一个零指针传递给COM方法,这会导致异常。就我个人而言,我对RCW知之甚少,所以我不能说为什么会发生这样的事情。 – 2013-05-14 13:28:20
在COM接口上,我总是检查指针并返回一个NULL值的E_POINTER。此外,如果NULL值违反合同,我会在COM服务器中添加调试输出。 – harper 2013-06-06 04:54:14