如何从Windows API文档中使用的接口名称获取COM类的GUID?
问题描述:
我正在研究为播放音频的各个应用程序设置Windows音频混合器设置的脚本(audio sessions)。我想设置通道音量,以平移音频,这是由IChannelAudioVolume API公开的内置Windows功能。如何从Windows API文档中使用的接口名称获取COM类的GUID?
我看到pycaw
使用许多基于COM的Windows API通过comtypes
,开始与提供的GUID声明,父接口和方法的细节comtypes
:
from ctypes import HRESULT, POINTER, c_uint32, c_float
from comtypes import IUnknown, GUID, COMMETHOD
class ISimpleAudioVolume(IUnknown):
_iid_ = GUID('{87CE5498-68D6-44E5-9215-6DA47EF883D8}')
_methods_ = (
# HRESULT SetMasterVolume(
# [in] float fLevel,
# [in] LPCGUID EventContext);
COMMETHOD([], HRESULT, 'SetMasterVolume',
(['in'], c_float, 'fLevel'),
(['in'], POINTER(GUID), 'EventContext')), # ...
在哪里这些GUID('{87CE5498-68D6-44E5-9215-6DA47EF883D8}'
)来从?它们不在单个界面的文档中。他们是否在某个地方正式记录?或者,有什么我可以运行从Windows中的接口名称(例如ISimpleAudioVolume
)查找它们?
与此同时,我只是使用谷歌搜索接口的名称以及没有{}
的主题相似接口的GUID值,希望能够遇到其他具有它们的代码。这对我的直接目的来说已经足够好了,但是碰到或者错过了,我不清楚这样找到的GUID是否作为公共API使用。
答
Windows SDK包含接口定义(IDL)文件以及Include目录中的C/C++头文件,这些文件包含GUID。
用于一个接口MSDN API文档提供C/C++头文件名下要求,在这种情况下Audioclient.h
。要在SDK头文件的位置,在我的情况
C:\Program Files (x86)\Windows Kits\8.0\Include\um
,你会发现相关的IDL文件Audioclient.idl
。
这对于每一个界面,在这里你可以找到的GUID,例如:
//-----------------------------------------------------------------------------
// Description: IChannelAudioVolume interface
//
[
object,
uuid(1C158861-B533-4B30-B1CF-E853E51C59B8),
// ...
节这是我想通了,但我仍然怀疑有一个更好的办法。也许有什么东西可以自动生成'.idl'中的'comtypes'声明?毕竟,这是IDL的重点。 – rakslice