나는 그 기능의 대부분에 대한 MS COM을 사용하는 라이브러리와 함께 표준 C + + 라이브러리 스마트 포인터를 사용하려고합니다 (나는 COM에 정통하지 않습니다). 로 대체 될 수COM 인터페이스와 STL 스마트 포인터를 사용하여
class MyClass
{
public:
MyClass(IDeckLink * device)
: m_deckLink(device)
{
}
MyClass::~MyClass()
{
if (m_deckLink != NULL)
{
m_deckLink->Release();
m_deckLink = NULL;
}
}
IDeckLink * m_deckLink;
};
이 : 그래서, 샘플 코드에서
struct COMDeleter {
template<typename T> void operator()(T* ptr) {
if (ptr) ptr->Release();
}
};
내 unique_ptr
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에 충실해야합니까 + +? 이 같은
Microsoft는 COM 포인터로 작업하기위한 몇 가지 스마트 포인터 클래스를 제공합니다. 그 중 하나를 사용하고 싶지 않은 이유가 있습니까? 이것은 존재하지 않는 문제에 대한 해답처럼 보입니다. –
COM 용으로'CComPtr'을 사용할 것을 권장합니다. 비슷한 질문이 이미 SO에 있습니다 - [이 질문을 참조하십시오] (0120)를 참조하십시오. – mpiatek
감사합니다! 죄송합니다 CComPtr을 인식하지 못했습니다. 그걸 조사해야 했어. COM을 사용하기 시작했습니다 ... – Luca