CComPtrの使用法



Ccomptr Usage



各ユーザーは使用中に厳密で正しいAddRefとReleaseを必要とするため、COMインターフェイスポインタは危険です。問題が発生すると、オブジェクトを正常に解放できないか、オブジェクトが繰り返し削除され、プログラムがクラッシュします。したがって、COMインターフェイスを使用する場合は、注意が必要です。
ただし、すべてのコードでさえ、正しいAddRefとReleaseが絶対確実であるとは限りません。次に例を示します。
void SomeApp(iHello * pHello)
{{
こんにちは* pCopy = pHello
pCopy-> AddRef()
OtherApp()
pCopy-> Hello()
pCopy-> Release()
}
非の打ちどころがないようですが、OtherAppで例外がスローされたとすると、pCopy-> Releaseはスキップされませんか?
幸い、CComPtrがあるため、すべての問題は単純なものから複雑なものまで、複雑なものから単純なものまでさまざまです。

CComPtrはスマートポインタと呼ばれ、ATLによって提供されるテンプレートクラスです。AddRefとReleaseを文法的に自動化する機能。 (ソースコードはatlbase.hにあります)
CComPtrの使用法は非常に簡単です。例としてIHello *を取り上げます。 CComPtrの代わりに、プログラムですべてのインターフェイスポインタタイプ(パラメータを除く)を使用します。つまり、プログラムのパラメーターに加えて、IHello *を使用せず、すべてCComPtrに置き換えます。
CComPtrの使用法は、通常のCOMポインターの使用法とほぼ同じです。また、以下の点にご注意ください。
1. CComPtrは、AddRefとReleaseの正しい呼び出しを保証しているため、必須ではなく、AddRefとReleaseを呼び出すことはできません。
二。スマートポインタを解放したい場合は、NULL値を指定してください。 (これは、nullに設定されていないため、間違っていたことを覚えておいてください)
3. CComPtr自体が破棄されると、COMポインタが解放されます。
4. CComPtrに&演算子(ポインターアドレスを取得)を使用する場合は、CComPtrがNULであることを確認してください。 (CComPtrの値がCComPtrに割り当てられているため、AddRefは自動的に呼び出されません。NULLでない場合、前のポインターを解放できません。CComPtrはアサートアラームを使用します)
例として手順を取り上げます。
void SomeApp(iHello * pHello)
{{
CComPtr pCopy = pHello
OtherApp()
pCopy-> Hello()
}
pCopyはローカルオブジェクトであるため、OtherApp()が例外をスローした場合でも、pCopyは破棄され、ポインターを解放できます。
プログラムがリリースされる前にクラッシュしたくない場合、およびCOMポインターの参照カウントがクラッシュするため、次の点に注意してください。プログラムのパラメーターに加えて、COMポインタータイプを直接使用しないでください。必ず置き換えてください。 CComPtrでそれを。




CComPtr --------