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