我想使用標準C++庫的智能指針與使用MS COM大部分其功能的庫智能指針(我必須說,我不是很精通與COM)。所以,我有我的unique_ptr
使用STL與COM接口
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指針時,有沒有你不希望使用其中的一個理由嗎?這似乎是對不存在的問題的解決方案。 –
我會推薦使用COM的CComPtr。類似的問題已經在SO - [看到這個問題](http://stackoverflow.com/questions/21820301/using-stdunique-ptr-for-managing-com-objects) – mpiatek
謝謝!對不起沒有意識到CComPtr。應該看看那個。剛開始使用COM ... – Luca