对CLSID_MMDeviceEnumerator和IID_IMMDeviceEnumerator的未定义引用

thi*_*his 3 c com winapi windows-7 mingw-w64

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

#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>

#include <stdlib.h>
#include <stdio.h>

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

当我使用__uuidof并使用g ++进行编译时,代码工作正常,但__uuidof的这个C"替换"却没有.

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

thi*_*his 5

使用MinGW-w64时,解决方案是在包含#include <initguid.h>包含COM标识符(例如mmdeviceapi.h,)的标头之前包含标头endpointvolue.h.

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

解:

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

#include <stdlib.h>
#include <stdio.h>

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;
}
Run Code Online (Sandbox Code Playgroud)