2013-05-14 70 views
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; 

什么会导致此异常?

+0

如何使用''tagRECT REC = pSpot.GetRect ();''当medhod如果定义为''GetRect(RECT * pRect)''?你不应该使用''pSpot.GetRect(rec)''? – fogbit 2013-05-14 07:45:30

+0

@fogbit - 不,一切都是正确的。高级别的COM包装,包括'RCW',通常会检查HRESULT返回,以便为非'S_OK'结果生成异常。标记为'[retval]'的参数成为这种包装方法的返回值。这里的实际问题是,封装器_sometimes_将一个零指针传递给COM方法,这会导致异常。就我个人而言,我对RCW知之甚少,所以我不能说为什么会发生这样的事情。 – 2013-05-14 13:28:20

+0

在COM接口上,我总是检查指针并返回一个NULL值的E_POINTER。此外,如果NULL值违反合同,我会在COM服务器中添加调试输出。 – harper 2013-06-06 04:54:14

回答

0

不知道这是你的问题,但是从COM方法使用RECT时,我需要“定义”的RECT对象如下:

[StructLayout(LayoutKind.Sequential, Pack = 0)] 
public struct RECT 
{ 
    public int left; 
    public int top; 
    public int right; 
    public int bottom; 
}