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

标签 c windows com

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

相关文章:

c - 使用双指针为结构内的动态结构数组分配内存**

python - 在Makefile中使用空格干净地处理文件路径

windows - 如何找到可移植 git-bash 的驱动器号

c++ - 创建 VARIANT 的 CMap 的正确方法

c# - 如何使用 C# 将 IUnknown 参数传递给 COM 接口(interface)?

c - 从字符串到二进制文件

python - 在 python 中导入时重定向 C 函数的标准输出时出现问题

c++ - 我可以在 sqlite3 中为表名使用参数吗?

c++ - GDI+ 中 PolyDraw 函数的等价物是什么?

c++ - 如何通过 COM 发送列表