インターフェイスIDiscoverを作成したことで、Test.dllという名前のCOMコンポーネントを作成しました。次の2通りの方法でポインタオブジェクトを割り当てることの違いは何ですか?
今私は、これら二つの間のdiffernceは何
IDiscoverPtr id(__uuid(TestClass)); and Test::IDiscover *id=NULL;
としてメモリを割り当てるの2通りに来たすべての情報は歓迎です.... ..
インターフェイスIDiscoverを作成したことで、Test.dllという名前のCOMコンポーネントを作成しました。次の2通りの方法でポインタオブジェクトを割り当てることの違いは何ですか?
今私は、これら二つの間のdiffernceは何
IDiscoverPtr id(__uuid(TestClass)); and Test::IDiscover *id=NULL;
としてメモリを割り当てるの2通りに来たすべての情報は歓迎です.... ..
まず一つはスマートポインタで、 2番目は通常のポインタです。
普通のCOMインターフェイスポインタを明示的にRelease()
する必要がありますが、Releasing
スマートポインタは心配する必要はありません。スマートポインタの詳細については
それとは別に、最初のものはTestClass
という名前のクラスのレジストリからGUIDを見つけようとCoCreateInstance
API呼び出して、このクラスのインスタンスを作成しようとします。それはCoCreateInstance
コールを通じてIDiscover
インターフェイスポインタを取得しようとしますが、失敗した場合はエラーをスローします。 IDiscoverPtr id(__uuid(TestClass));
行が正常に実行された場合は、有効なIDiscover
インターフェイスポインタがid
に存在する必要があります。
第2のものは単純にインターフェイスポインタの宣言であり、それ以外のものはありません。 CoCreateInstance
を介して(ほとんどの場合)自分自身をインスタンス化しなければならないか、その1つのバリアントです。
第1の変形はスマートポインタであり、第2の変形は生の(通常のポインタ)である。スマートポインタは、そのオブジェクトがスコープから外れると、接続されたオブジェクトのIUnknown :: Release()を呼び出します。生のポインタはそうしないでしょうし、適切な瞬間に明示的にオブジェクトのIUnknown :: Release()を呼び出さない限り、おそらくメモリリークが発生します。
最初の変種は、(クラスIDでパラメータ化されたコンストラクタを使用するので)独自の構築時にCOMオブジェクトをインスタンス化しようとします。詳細については、_com_ptr_t(comip.h)のソースを参照してください。 2番目の変種は、nullに初期化されたポインタを与えます - オブジェクトには接続されていません。
COMオブジェクトのスマートポインタには、オブジェクトをインスタンス化してQueryInterface()を呼び出すのに便利なメンバ関数があります。これにより、書き込みに必要なコード量が削減されることがよくあります。ローポインタを使用すると、CoCreateInstance()をいくつかのパラメータで呼び出す必要があります。ほとんどの場合、デフォルト値に設定されます。これにより、より多くのコードを書く必要があります。 _com_ptr_tの完全なソースについては、もう一度comip.hを参照してください。
実際の理由がない限り、スマートポインタを使用することをお勧めします。
__uuid( "
スマートポインタを使用すると、コンストラクタを__uuidにするか、デフォルトのコンストラクタを使用して_com_ptr :: CreateInstance()メソッドまたはグローバルCoCreateInstance()を呼び出す - より適切なもの。後者は例外をスローせず、むしろHRESULTを返します。 – sharptooth
実際には2番目のものに何かを割り当てていますか? – EFraim