COM接口方法可以返回不同的HRESULT
值信號傳遞無效的參數值。我什麼時候可以返回E_POINTER
和E_INVALIDARG
?當返回E_POINTER和E_INVALIDARG時?
據我所知,如果一個方法包封的集合中接收到一個指數,它超出範圍即E_INVALIDARG
的。如果一個方法接收到一個Interface**
指針,該指針用於存儲指向E_POINTER
的新創建對象的指針。
HRESULT CImpl::GetItem(long index; Interface** result)
{
if(result == 0) {
return E_POINTER;
}
if(index < 0 || index >= internalArray.size()) {
return E_INVALIDARG;
}
*result = CreateWrapperObject(internalArray[index]);
return S_OK;
}
但是如果它收到一個WCHAR*
緩衝與文件名「中的」參數中,這WCHAR*
爲空?這是E_POINTER
還是E_INVALIDARG
?
或者一個方法接收到一個指向某個結構體的指針,並且期望通過該指針填充該結構體,並且該指針爲空 - 是E_POINTER
還是E_INVALIDARG
?
HRESULT CImpl::SaveToFile(WCHAR* fileName)
{
if(fileName == 0) {
return // what to return here?
}
//... do actual work here
}
HRESULT CImpl::GetAttributes(Attributes* to)
{
if(to == 0) {
return // what to return here?
}
attributes->IsCool = getIsCool();
attributes->Color = RGB(0, 255, 0);
return S_OK;
}
什麼是何時返回E_POINTER
規則,當E_INVALIDARG
檢查時,指針類型的參數?
你有任何文檔參考? – Constantin 2009-11-13 12:49:36
同意。我真的很想看到這個MSDN參考。上面提到了某種意義,但具有規範性的指責是很好的。 – 2011-09-30 14:16:02
我不確定這個答案是否正確。例如,在VS2010'',在'AtlSetChildSite()'實現,'是,如果'punkChild'參數是'NULL',而不是根據這個答案(如果我理解正確的話),'E_INVALIDARG返回E_POINTER' 「應該在這種情況下返回。我認爲ATL是很好的COM編程實踐的一個很好的來源,所以'E_POINTER'應該在一般情況下返回無效(例如'NULL')指針。但坦率地說,我也不確定,我同意一些MSDN官方參考將會很好。 –
2012-11-23 10:51:06