首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否应该使用DllGetClassObject创建IUnknown::Release接口

我是否应该使用DllGetClassObject创建IUnknown::Release接口
EN

Stack Overflow用户
提问于 2011-03-23 04:10:36
回答 3查看 786关注 0票数 1

我正在尝试调试一些使用COM的代码,这是我的初学者。最后对IUnknown::Release的两次调用让我很担心。接口是用DllGetClassObject和IClassFactory::CreateInstance创建的。我见过其他类似的代码没有在这些代码上调用IUnknown::Release -哪一个是正确的?

代码语言:javascript
复制
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);
   }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-23 04:30:55

绝对一点儿没错。这两个函数都创建了一个新的接口指针,它们的引用计数将为1,因为AddRef()函数已经被调用。当你完成它的时候,你必须调用Release()。如果你不这样做,你会泄漏内存。COM中的每个接口都是这样工作的。

票数 3
EN

Stack Overflow用户

发布于 2011-03-23 04:29:33

是。正如在DllGetClassObject示例中看到的,返回的ppvObj将有一个引用计数。

票数 2
EN

Stack Overflow用户

发布于 2011-03-23 14:02:00

是的,DllGetClassObject()将创建一个对象,并将该对象的所有权传递给您的代码。您的代码现在将拥有对象,并负责通过调用IUnknown::Release()来释放它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5397206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档