【问题标题】:How to get GUIDs of COM classes from the interface names used in the Windows API documentation?如何从 Windows API 文档中使用的接口名称获取 COM 类的 GUID?
【发布时间】:2018-03-11 20:13:40
【问题描述】:

为 Windows SDK 文档中命名的给定 COM 类(例如 IChannelAudioVolume)查找 GUID(例如 {1C158861-B533-4B30-B1CF-E853E51C59B8})的正确方法是什么?

我正在编写一个 Python 脚本,该脚本为正在播放音频的单个应用程序 (audio sessions) 设置 Windows 音频混音器设置。我想设置通道音量,以平移音频,这是IChannelAudioVolume API 公开的内置 Windows 功能。

我看到pycaw 通过comtypes 使用许多基于COM 的Windows API,从向comtypes 提供GUID、父接口和方法详细信息的声明开始:

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。

【问题讨论】:

    标签: python windows com comtypes


    【解决方案1】:

    这个在线工具MagnumDb 作为“幻数数据库”(免责声明:我写的)是一个完全免费的搜索引擎,它包含 99% 的 Windows SDK 常量和超过 70K 的 guid(IID、CLSID 等)。

    可以按名称或按值,使用通配符等方式查询,例如:http://www.magnumdb.com/search?q=IChannelAudioVolume

    将为您提供此信息(名称、类型、值、SDK 头文件位置):

    IID_IChannelAudioVolume Guid    1c158861-b533-4b30-b1cf-e853e51c59b8    %ProgramFiles(x86)%\Windows Kits\10\Include\10.0.17134.0\um\Audioclient.h(1942,0)
    

    【讨论】:

      【解决方案2】:

      Windows SDK 包含接口定义 (IDL) 文件以及 Include 目录中的 C/C++ 头文件,这些文件包含 GUID。

      接口的 MSDN API 文档for instance IChannelAudioVolume 在页面底部附近的 Requirements 框中提供了 C/C++ 头文件名。对于IChannelAudioVolume,它是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 的意义所在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2014-02-28
      • 2013-01-15
      • 2012-08-02
      相关资源
      最近更新 更多