gpt4 book ai didi

c - 我应该 IUnknown::Release 使用 DllGetClassObject 创建的接口(interface)吗

转载 作者:可可西里 更新时间:2023-11-01 11:14:33 25 4
gpt4 key购买 nike

我正在尝试调试一些使用 COM 的代码,我是初学者。最后对 IUnknown::Release 的两次调用让我很担心。这些接口(interface)是使用 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);
}
}

最佳答案

当然。两个函数都创建一个新的接口(interface)指针,它们的引用计数为 1,AddRef() 函数已被调用。完成后,您必须调用 Release()。如果你不这样做,你会泄漏内存。 COM 中的每个接口(interface)都是这样工作的。

关于c - 我应该 IUnknown::Release 使用 DllGetClassObject 创建的接口(interface)吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com