2009-09-15 8 views
8

COMインターフェイスメソッドは、さまざまなHRESULT値を返して、渡された無効な引数値を通知します。いつE_POINTERを返しますか?E_INVALIDARGE_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*がnullの場合?これはE_POINTERですか、E_INVALIDARGですか?

メソッドは、ある構造体へのポインタを受け取り、そのポインタを介して構造体を埋めると予想され、このポインタはnullです。これは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

のポインタへの参照がである場合、これはプログラムまたはinteropレイヤのバグを示すエラーコードとみなされます。

たとえば、範囲外の問題またはパラメータが互いに衝突するなどのパラメータでアプリケーションレベルがオンの場合、E_INVALIDARGを返します。あなたのケースでは

空のファイル名を渡すことが有効ではないので、SaveToFile(...)にあなたはE_INVLIADARGを返す必要がありますし、あなたが値を埋めることができないので(それはアウトparamはの場合)GetAttributes(...)にあなたはE_POINTERを返す必要があります。

はい、私たちはすべてL-O-V-Ecomです。

+0

ドキュメント参照はありますか? – Constantin

+0

合意。私は本当にこのためのMSDNのリファレンスを見たいと思います。上記は何らかの意味を持ちますが、標準的な定義を持つことは良いことです。 –

+0

この回答が正しいかどうかわかりません。たとえば、VS2010の ''の 'AtlSetChildSite()'実装では、 'punkChild'パラメータが' NULL'ならば、この答え(正確に理解すれば)の代わりに 'E_POINTER'が返され、' E_INVALIDARG 'その場合返されているはずです。私はATLは良いCOMプログラミングの良いソースだと思うので、無効な(例えば 'NULL')ポインタの一般的な場合には' E_POINTER'を返すべきでしょう。しかし、率直に言っても私はどちらか分かりませんが、私はMSDNの公式の参考文献が良いだろうと同意します。 'pVar'(' _In_ VARIANT *が ') 'NULLである場合' E_POINTER'が返され、 'PutProperty()'の実装体において、 '' CComPtr 専門に、同じ '' ヘッダに、混乱に追加する –

関連する問題