私は、その機能のほとんどにMS COMを使用するライブラリで標準のC++ライブラリスマートポインタを使用しようとしています(COMに精通していないと言う必要があります)。だから、私は、サンプルコードでは、私のunique_ptr
COMインターフェイスでSTLスマートポインタを使用する
struct COMDeleter {
template<typename T> void operator()(T* ptr) {
if (ptr) ptr->Release();
}
};
ための次のカスタム削除手段を持って、私たちのようなものを持っている:
class MyClass
{
public:
MyClass(IDeckLink * device)
: m_deckLink(device)
{
}
MyClass::~MyClass()
{
if (m_deckLink != NULL)
{
m_deckLink->Release();
m_deckLink = NULL;
}
}
IDeckLink * m_deckLink;
};
これを置き換えることができます。
今class MyClass
{
public:
MyClass(IDeckLink * device)
{
m_deckLink.reset(device);
}
std::unique_ptr<IDeckLink, COMDeleter> m_deckLink;
};
、私はIDeckLinkInput
と呼ばれる別のインターフェイスを持っていますが、これは同様の方法で折り返していますが、これが初期化される方法は次のように異なります。
IDeckLinkInput* m_deckLinkInput = NULL;
if (m_deckLink->QueryInterface(IID_IDeckLinkInput, (void**) &m_deckLinkInput) != S_OK)
return false;
だから、私のようなスマートポインタがある場合:私は、私は上記のような初期化機能でそれを使用する方法を確認していない
std::unique_ptr<IDeckLinkInput, COMDeleter> m_deckLinkInput(nullptr);
を?私は古いスタイルのC++に固執する必要がありますか?このような
マイクロソフトでは、COMポインタを操作するためのスマートポインタクラスをいくつか提供しています。その中の1つを使用したくない理由はありますか?これは存在しない問題の解決策のようです。 –
COM用に 'CComPtr'を使うことをお勧めします。同様の質問はすでにSOにあります - [この質問を参照](http://stackoverflow.com/questions/21820301/using-stdunique-ptr-for-managing-com-objects) – mpiatek
ありがとう!申し訳ありませんが、CComPtrを認識していませんでした。それを見ていたはずです。 COMを使用し始めたばかりです... – Luca