对CLSID_MMDeviceEnumerator和IID_IMMDeviceEnumerator的未定义引用

尝试使用COM和CoCreateInstance()在C中使用MinGW-w64编译示例代码失败。

#include  #include  #include  #include  #include  extern const CLSID CLSID_MMDeviceEnumerator; extern const IID IID_IMMDeviceEnumerator; int main( void ) { CoInitialize( NULL ); LPVOID device = NULL; const HRESULT ok = CoCreateInstance( &CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &device ); CoUninitialize(); return EXIT_SUCCESS; } 

编译:gcc main.c libole32.a -Wall -Wextra -oa

即使在mmdeviceapi.h中定义了CLSID_MMDeviceEnumerator,也找不到它。 实际上从示例代码中删除我的extern定义会得到相同的结果,因为两个externs似乎都在mmdeviceapi.h中定义

当我使用__uuidof并使用g ++编译代码时,但__uuidof的这个C“替换”却没有。

为什么没有找到COM标识符?

使用MinGW-w64时,解决方案是包含头文件#include ,然后包含包含COM标识符的头文件,例如mmdeviceapi.hendpointvolue.h

然后不需要额外的声明,并且可以直接使用标识符。

解:

 #include  #include  #include  #include  #include  #include  int main( void ) { CoInitialize( NULL ); LPVOID device = NULL; const HRESULT ok = CoCreateInstance( &CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &device ); CoUninitialize(); return EXIT_SUCCESS; }