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;
}
}
MSDN文檔有大約IAudioCaptureClient一個非常具體的警告::發佈()。 Quote:「當釋放IAudioCaptureClient接口實例時,客戶端必須調用與創建該對象的IAudioClient :: GetService調用相同的線程的實例的Release方法。」違反這樣的要求很可能會導致僵局。 –
如果'CoInitializeEx'調用失敗,您仍*執行'CoUnitialize',這是錯誤的。 –
'#define AUTO_COM_SUPPORT AutoCOM'哇,你不想這樣做。 'releaseComObject'應該知道COM已經初始化或者'pT'從哪裏來?取出'AUTO_COM_SUPPORT'並刻錄它。 – Ben