如何从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), 
    // ... 
+0

节这是我想通了,但我仍然怀疑有一个更好的办法。也许有什么东西可以自动生成'.idl'中的'comtypes'声明?毕竟,这是IDL的重点。 – rakslice