2009-09-15 55 views
8

COM接口方法可以返回不同的HRESULT值信號傳遞無效的參數值。我什麼時候可以返回E_POINTERE_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檢查時,指針類型的參數?

回答

9

如果out參數指針的引用爲空,則返回E_POINTER,這被認爲是指示程序或互操作層中的錯誤的錯誤代碼。

將返回E_INVALIDARG時,有上與參數例如超出範圍的問題或參數相互碰撞的應用水平。

在你的情況下,在SaveToFile(...)你應該返回E_INVLIADARG,因爲它是無效的傳球空文件名,並在GetAttributes(...)你應該返回E_POINTER(如果它是一個不折不扣PARAM),因爲你可以不填值。

是的,我們所有的L-O-V-E com :)

+0

你有任何文檔參考? – Constantin 2009-11-13 12:49:36

+0

同意。我真的很想看到這個MSDN參考。上面提到了某種意義,但具有規範性的指責是很好的。 – 2011-09-30 14:16:02

+0

我不確定這個答案是否正確。例如,在VS2010'',在'AtlSetChildSite()'實現,'是,如果'punkChild'參數是'NULL',而不是根據這個答案(如果我理解正確的話),'E_INVALIDARG返回E_POINTER' 「應該在這種情況下返回。我認爲ATL是很好的COM編程實踐的一個很好的來源,所以'E_POINTER'應該在一般情況下返回無效(例如'NULL')指針。但坦率地說,我也不確定,我同意一些MSDN官方參考將會很好。 – 2012-11-23 10:51:06

相關問題