2016-06-13 91 views
1

我正在调试客户站点上的间歇性问题。我已经明白,在COM对象上调用Release()似乎没有返回。在COM对象上调用发布永远不会返回

第一个日志是打印,但我从来没有看到第二个日志。我只能假定拨打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; 
    } 
} 
+4

MSDN文档有大约IAudioCaptureClient一个非常具体的警告::发布()。 Quote:“当释放IAudioCaptureClient接口实例时,客户端必须调用与创建该对象的IAudioClient :: GetService调用相同的线程的实例的Release方法。”违反这样的要求很可能会导致僵局。 –

+2

如果'CoInitializeEx'调用失败,您仍*执行'CoUnitialize',这是错误的。 –

+3

'#define AUTO_COM_SUPPORT AutoCOM'哇,你不想这样做。 'releaseComObject'应该知道COM已经初始化或者'pT'从哪里来?取出'AUTO_COM_SUPPORT'并刻录它。 – Ben

回答

0

从来没有发现一个重复的场景的问题。但是这个问题已经被@ Cheersandhth提到的智能指针的用户避免了。-Alf。感谢您的反馈。

基本上使用下面的宏定义智能指针,并删除了所有引用Release()

_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));

相关问题