我正在尝试调试一些使用COM的代码,这是我的初学者。最后对IUnknown::Release的两次调用让我很担心。接口是用DllGetClassObject和IClassFactory::CreateInstance创建的。我见过其他类似的代码没有在这些代码上调用IUnknown::Release -哪一个是正确的?
int OpenMixer_Win_DirectSound(px_mixer *Px, int index)
{
DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA desc;
HMODULE hDsound = INVALID_HANDLE_VALUE;
GCO DllGetClassObject;
IClassFactory *pcf = NULL;
IKsPropertySet *pps = NULL;
HRESULT hr;
ULONG bytes;
LPGUID guidIn;
LPGUID guidOut;
UINT deviceIn = -1;
UINT deviceOut = -1;
int ret = FALSE;
guidIn = PaWinDS_GetStreamInputGUID(Px->pa_stream);
guidOut = PaWinDS_GetStreamOutputGUID(Px->pa_stream);
do {
hDsound = LoadLibraryA("dsound.dll");
if (hDsound == NULL) {
break;
}
DllGetClassObject = (GCO) GetProcAddress(hDsound, "DllGetClassObject");
if (DllGetClassObject == NULL) {
break;
}
hr = DllGetClassObject(&CLSID_DirectSoundPrivate,
&IID_IClassFactory,
(void **)(&pcf));
if (hr || pcf == NULL) {
break;
}
hr = IClassFactory_CreateInstance(pcf,
NULL,
&IID_IKsPropertySet,
(void **)(&pps));
if (hr || pps == NULL) {
break;
}
/* Do stuff with the interfaces */
} while( FALSE );
if (pps) {
IUnknown_Release(pps);
}
if (pcf) {
IUnknown_Release(pcf);
}
// Free the library. Note that portaudio also opens dsound.dll
// so this probably doesn't do anything until Pa_Terminate is called.
if (hDsound != INVALID_HANDLE_VALUE) {
FreeLibrary(hDsound);
}
}发布于 2011-03-23 04:30:55
绝对一点儿没错。这两个函数都创建了一个新的接口指针,它们的引用计数将为1,因为AddRef()函数已经被调用。当你完成它的时候,你必须调用Release()。如果你不这样做,你会泄漏内存。COM中的每个接口都是这样工作的。
发布于 2011-03-23 04:29:33
是。正如在DllGetClassObject示例中看到的,返回的ppvObj将有一个引用计数。
发布于 2011-03-23 14:02:00
是的,DllGetClassObject()将创建一个对象,并将该对象的所有权传递给您的代码。您的代码现在将拥有对象,并负责通过调用IUnknown::Release()来释放它。
https://stackoverflow.com/questions/5397206
复制相似问题