【发布时间】:2013-05-08 03:33:39
【问题描述】:
我需要从 COM 获取一个 64 位的 RECT 到 C#,所以我在 IDL 中定义了一个简单的方法为:
[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();
大部分时间都可以,但有时我会得到 0xC0000005:访问冲突写入位置 0x0000000000000000。
排队:
*pRect = rec;
什么会导致这个异常?
【问题讨论】:
-
如果方法定义为
GetRect(RECT* pRect),如何使用tagRECT rec = pSpot.GetRect();?你不应该使用pSpot.GetRect(rec)吗? -
@fogbit - 不,这里的一切都是正确的。高级 COM 包装器(包括
RCW)经常检查 HRESULT 返回以针对非S_OK结果生成异常。标记为[retval]的参数成为此类包装方法的返回值。这里的实际问题是包装器sometimes 将零指针传递给COM 方法,这会导致异常。我个人对RCW知之甚少,所以我不能说为什么会发生这种事情。 -
在 COM 接口上,我总是会检查指针并在 NULL 值上返回 E_POINTER。此外,如果 NULL 值违反合同,我会在 COM 服务器中添加调试输出。