2013-05-14 71 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; 
}