对 CLSID_MMDeviceEnumerator 和 IID_IMMDeviceEnumerator 的未定义引用
Undefined reference to CLSID_MMDeviceEnumerator and IID_IMMDeviceEnumerator
尝试使用 C 中的 MinGW-w64 使用 COM 和 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;
}
编译:gcc main.c libole32.a -Wall -Wextra -o a
即使在 mmdeviceapi.h 中定义了 CLSID_MMDeviceEnumerator,也找不到它。实际上从示例代码中删除我的外部定义给出了相同的结果,因为两个外部似乎都在 mmdeviceapi.h
中定义
当我使用 __uuidof 并使用 g++ 编译代码时,代码有效,但是 __uuidof 的 C "replacement" 没有。
为什么找不到 COM 标识符?
使用 MinGW-w64 时,解决方案是先包含 header #include <initguid.h>
,然后再包含包含 COM 标识符的 header,例如 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;
}
尝试使用 C 中的 MinGW-w64 使用 COM 和 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;
}
编译:gcc main.c libole32.a -Wall -Wextra -o a
即使在 mmdeviceapi.h 中定义了 CLSID_MMDeviceEnumerator,也找不到它。实际上从示例代码中删除我的外部定义给出了相同的结果,因为两个外部似乎都在 mmdeviceapi.h
中定义当我使用 __uuidof 并使用 g++ 编译代码时,代码有效,但是 __uuidof 的 C "replacement" 没有。
为什么找不到 COM 标识符?
使用 MinGW-w64 时,解决方案是先包含 header #include <initguid.h>
,然后再包含包含 COM 标识符的 header,例如 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;
}