Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对CLSID_MMDeviceEnumerator和IID_imDeviceEnumerator的未定义引用_C_Winapi_Windows 7_Com_Mingw W64 - Fatal编程技术网

对CLSID_MMDeviceEnumerator和IID_imDeviceEnumerator的未定义引用

对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

尝试在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 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。