我应该使用DllGetClassObject创建IUnknown :: Release接口吗?

时间:2011-03-22 20:10:36

标签: c windows com

我正在尝试调试一些使用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);
   }
}

3 个答案:

答案 0 :(得分:3)

绝对。这两个函数都创建一个新的接口指针,它们的引用计数为1,AddRef()函数已被调用。当你完成它之后,你来调用Release()。如果不这样做,你会泄漏内存。 COM中的每个接口都以这种方式工作。

答案 1 :(得分:2)

是。如DllGetClassObject示例中所示,返回ppvObj将具有引用计数。

答案 2 :(得分:0)

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