私はOLEDBを介してSQLデータベースと通信するためにATLを使用しています。ATL CCommand破棄時に閉じる
私の質問は、私は、私が以前にOpen
またはCCommand
デストラクタはクリーンアップするかどうかを呼んでいる場合は、明示的にCCommand::Close
を呼び出す必要はありかどうかです。
私はClose
に電話をしなければならないと感じていますが、私はしなくていいですね!
ありがとうございました。
私はOLEDBを介してSQLデータベースと通信するためにATLを使用しています。ATL CCommand破棄時に閉じる
私の質問は、私は、私が以前にOpen
またはCCommand
デストラクタはクリーンアップするかどうかを呼んでいる場合は、明示的にCCommand::Close
を呼び出す必要はありかどうかです。
私はClose
に電話をしなければならないと感じていますが、私はしなくていいですね!
ありがとうございました。
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
のデストラクタはそれをすべてを行います。
MSDNに記載されているように、Close
とReleaseCommand
の両方を呼び出す必要があります。
ありがとう@ダニエル。私はそれを読んだが、CCommandのデストラクタが特に例外が発生した状況で何らかのクリーンアップを実行するかどうかを疑問に思っただけです。ドキュメントは何も言わないので、私は推測していません。 – Nick
はい、しかし、 '〜ССommand'は舞台裏で' ReleaseCommand'をしています。デストラクタはそれをクリーンアップします。コマンドインスタンスを再利用する場合は、明示的な呼び出しが必要です。 MSDNの例はあまり良くありません。彼らはCoUninitializeによって完了しなければならないので、明示的に行います。 –
あなたの答えをありがとう。 'Close'にも同じことが適用されますか? – Nick
はい、「閉じる」にも同じことが適用されます。デストラクタによっても自動的に呼び出されます。最初にこれを示すために上記の答えが更新されました。 –
あなたはこれのソースを提供できますか?もしそうなら、私はあなたの答えを受け入れるでしょう! – Nick