2016-06-13 79 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));

相關問題