2012-01-19 14 views
0

私はOLEDBを介してSQLデータベースと通信するためにATLを使用しています。ATL CCommand破棄時に閉じる

私の質問は、私は、私が以前にOpenまたはCCommandデストラクタはクリーンアップするかどうかを呼んでいる場合は、明示的にCCommand::Closeを呼び出す必要はありかどうかです。

私はCloseに電話をしなければならないと感じていますが、私はしなくていいですね!

ありがとうございました。

答えて

1

Danielの答えに私のコメントを見てください。デストラクタはそれをクリーンアップし、あなたは心配する必要はありません。 MSDNコードスニペットはCoUninitializeの後に呼び出されるデストラクタを持っていて、これはCOMをシャットダウンする前にインターフェイスを解放するために明示的にReleaseCommandを行う唯一の理由です。

CoInitialize(...); 
{ 
    CCustomer rs; 
    // ... 
    // rs.ReleaseCommand() <<-- Not needed 
    // rs.Close() <<-- Not needed 
} 
// NOTE: ~CCustomer already worked, it is safe to shut COM down 
CoUninitialize(); 

理由:

彼らはそれではなく、このように行っているだろうか? ATLのatldbcli.h

~CAccessorRowset() 
{ 
    Close(); 
} 

// ... 

~CCommandBase() 
{ 
    ReleaseCommand(); 
} 

// ... 

class CCommand : 
    public CAccessorRowset<TAccessor, TRowset>, 
    public CCommandBase, 
    public TMultiple 

のでCCommandのデストラクタはそれをすべてを行います。

+0

あなたの答えをありがとう。 'Close'にも同じことが適用されますか? – Nick

+0

はい、「閉じる」にも同じことが適用されます。デストラクタによっても自動的に呼び出されます。最初にこれを示すために上記の答えが更新されました。 –

+0

あなたはこれのソースを提供できますか?もしそうなら、私はあなたの答えを受け入れるでしょう! – Nick

0

MSDNに記載されているように、CloseReleaseCommandの両方を呼び出す必要があります。

+0

ありがとう@ダニエル。私はそれを読んだが、CCommandのデストラクタが特に例外が発生した状況で何らかのクリーンアップを実行するかどうかを疑問に思っただけです。ドキュメントは何も言わないので、私は推測していません。 – Nick

+1

はい、しかし、 '〜ССommand'は舞台裏で' ReleaseCommand'をしています。デストラクタはそれをクリーンアップします。コマンドインスタンスを再利用する場合は、明示的な呼び出しが必要です。 MSDNの例はあまり良くありません。彼らはCoUninitializeによって完了しなければならないので、明示的に行います。 –

関連する問題