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