对CLSID_MMDeviceEnumerator和IID_imDeviceEnumerator的未定义引用
尝试在C中使用COM和使用MinGW-w64的CoCreateInstance()编译示例代码失败对CLSID_MMDeviceEnumerator和IID_imDeviceEnumerator的未定义引用,c,winapi,windows-7,com,mingw-w64,C,Winapi,Windows 7,Com,Mingw W64,尝试在C中使用COM和使用MinGW-w64的CoCreateInstance()编译示例代码失败 #include <windows.h> #include <mmdeviceapi.h> #include <endpointvolume.h> #include <stdlib.h> #include <stdio.h> extern const CLSID CLSID_MMDeviceEnumerator; extern con
#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;
}
#包括
#包括
#包括
#包括
#包括
外部常量CLSID CLSID\u MMDeviceEnumerator;
外部常量IID IID_IMMDeviceEnumerator;
内部主(空)
{
共初始化(空);
LPVOID设备=空;
const HRESULT ok=CoCreateInstance(&CLSID\MMDeviceEnumerator,NULL,
CLSCTX_INPROC_服务器和IID_IMMDeviceEnumerator,
&装置);
coninitialize();
返回退出成功;
}
使用:gcc main.c libole32.a-Wall-Wextra-oa编译
即使在mmdeviceapi.h中定义了CLSID_MMDeviceEnumerator,也找不到它。实际上,从示例代码中删除我的外部定义会得到相同的结果,因为这两个外部定义似乎都是在mmdeviceapi.h中定义的
当我使用uuidof并用g++编译代码时,代码是有效的,但是这个C“替换”的uuidof没有
为什么找不到COM标识符?使用MinGW-w64时,解决方案是在包含包含COM标识符的头之前,先包含头
#include
,例如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;
}
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
共初始化(空);
LPVOID设备=空;
const HRESULT ok=CoCreateInstance(&CLSID\MMDeviceEnumerator,NULL,
CLSCTX_INPROC_服务器和IID_IMMDeviceEnumerator,
&装置);
coninitialize();
返回退出成功;
}
试试-luuid
。我不知道您正在使用的多媒体API是否会得到任何非最先进的MinGW-w64(甚至我也不知道)的支持。您将它们定义为extern
,因此编译器希望您无论如何都能提供它们。如果无法链接.lib
(.a
),请定义项目的静态变量(使用相应的GUID
值)。@romar。是的,我知道。我不是问如何获取标识符的实际值。可以将\uuidof
看作是获取extern
和带有值的自动静态变量。在代码片段中,您只执行extern
part。