调用COM对象的释放似乎永远不会返回

时间:2016-06-13 16:56:13

标签: c++ windows com

我在客户网站上调试间歇性问题。我已经明白了,COM对象上的Release()调用似乎没有返回。

第一个日志是打印但我从未看到第二个日志。我只能假设对Release()的调用由于某种原因从未返回(或者可能是CoInitializeEx())。

我不知道下一步该寻找什么,任何帮助/线索将不胜感激。

Logger::getLogger()->logTrace("AudioCapturer::_shutdown. _pEndpointAudioClient_COM Released. (%s)", _deviceName.c_str());
releaseComObject(_pAudioCaptureClient_COM);
Logger::getLogger()->logTrace("AudioCapturer::_shutdown (%s) succeeded", _deviceName.c_str());

以下是支持代码:

IAudioCaptureClient *_pAudioCaptureClient_COM;

// Class that Initializes COM on creation and Unitializes on destruction
AutoCOM::AutoCOM() { CoInitializeEx(NULL, COINIT_MULTITHREADED); }
AutoCOM::~AutoCOM() { CoUninitialize(); }


#define AUTO_COM_SUPPORT AutoCOM _autoCOM

// Safe releasing of COM objects. Zeros the pointer
// to the COM object. Safe to use with NULL
// pointers.
template <class T> void releaseComObject(T*& pT) {
     if (pT) {
           AUTO_COM_SUPPORT;
           (pT)->Release();
           pT = NULL;
     }
}

1 个答案:

答案 0 :(得分:0)

从未找到问题的重复方案。但问题是由智能指针的使用者避免的,@ Cheersandhth.-Alf提到了这一点。感谢您的反馈。

基本上使用以下宏来定义智能指针,并删除对Release()

的所有引用

_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));