【问题标题】:__uuidof in C Master Volume WindowsC 主卷窗口中的 __uuidof
【发布时间】:2018-04-11 06:28:32
【问题描述】:

我想用 C 更改主卷,但 __uuidof 仅适用于 C++;我可以用什么来代替它?

const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
hr = CoCreateInstance(
     CLSID_MMDeviceEnumerator, NULL,
     CLSCTX_ALL, IID_IMMDeviceEnumerator,
     (void**)&deviceEnumerator);

我只发现:Alternative to __uuidof in C

【问题讨论】:

  • 哇!一个实际上值得 C 和 C++ 标记的问题。 :D
  • @klutt 不是真的,问题不在于 C++。
  • 是的,可能重复,我把这个链接放在我的帖子里
  • 我已经看到了链接,但到目前为止,您未能解释您的问题与您链接的问题有何不同。他们似乎在问完全相同的事情。

标签: c windows com uuid


【解决方案1】:

CLSID_MMDeviceEnumeratorIID_IMMDeviceEnumerator 定义为in your API's header file,即<mmdeviceapi.h>

您必须在 C 代码中使用这些定义,而不是 __uuidof,因为这仅适用于 C++ 代码。

请注意,您需要在<mmdeviceapi.h> 之前包含<initguid.h>

#include <initguid.h>
#include <mmdeviceapi.h>

那么这段代码应该可以工作:

hr = CoCreateInstance(
    &CLSID_MMDeviceEnumerator, (*)
    NULL,
    CLSCTX_ALL, 
    &IID_IMMDeviceEnumerator,  (*)
    (void**)&deviceEnumerator
);

(*) 请注意,我使用了&amp;(地址),因为在 C++ 中你有引用,但在 C 代码中你需要显式地使用指针。

【讨论】:

  • 谢谢!最后一个问题,是否可以在 C 中使用接口方法?喜欢这里:msdn.microsoft.com/fr-fr/library/windows/desktop/…我有一个问题:hr = deviceEnumerator-&gt;GetDefaultAudioEndpoint(eRender, eConsole, &amp;defaultDevice);
  • 是的,可以在 C 中调用 COM 接口方法,但语法比在 C++ 中要冗长一些。您必须将对象指针指定为第一个参数(C++ 中隐含的this),并且必须显式编写 v-table 指针(lpVtbl),例如hr = deviceEnumerator-&gt;lpVtbl-&gt;GetDefaultAudioEndpoint(deviceEnumerator, /* other params ...*/);。一些 SDK 提供辅助预处理器宏来简化 C 中的调用语法。
  • 恕我直言,您可以考虑使用 C++ 来简化您的代码,而不是使用纯 C。
  • 我也要用libvlc,你觉得C++适合我吗?
  • 如前所述,我认为 C++ 是 COM 编程的一个非常好的选择(比 C 更好)。但是我对libvlc一无所知。
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多