首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >被win32api + COM严重迷惑并给出答案

被win32api + COM严重迷惑并给出答案
EN

Stack Overflow用户
提问于 2013-10-26 17:34:26
回答 1查看 1.3K关注 0票数 2

从这里的另一个问题中,我问到如何从和Zune检索当前播放的歌曲,我从一个c++开发人员那里得到了一个答案,他解释了我将如何为WMP做这件事。

但是,我不是C++开发人员,也不是非常熟悉pywin32库的人。除此之外,所有这些文件(特别是关于WMP的文档)是可怕的。

为此,我需要您的帮助,以理解我将如何在Python中完成以下工作。

来源

我有工作代码在C++打印媒体名称,目前正在播放的WMP。这是一个简单的控制台应用程序(78行代码)。 步骤: 1)实现了一个实现IUnknown、IOleClientSite、IServiceProvider和IWMPRemoteMediaServices的基本COM对象。这很简单(可以说,您的里程可能会有所不同),使用ATL模板CComObjectRootEx。唯一需要(简单)代码的方法是IServiceProvider::QueryService和IWMPRemoteMediaServices::GetServiceType。所有其他方法都可能返回E_NOTIMPL 2)实例化"WMPlayer.OCX“COM对象(在我的例子中,通过CoCreateInstance) 3)通过QueryInterface从对象中检索IOleObject接口指针 4)从1中所见的类中获取对象(我使用CComObject<>::CreateInstance模板) 5)使用来自3)接口的SetClientSite方法,传递指向OleClientSite实现的指针。 6)在SetClientSite调用期间,WMP将回调您: fisrt请求一个IServiceProvider接口指针,第二个调用QueryService方法,请求一个IWMPRemoteMediaServices接口指针。返回IWMPRemoteMediaServices的实现,第三,将通过GetServiceType再次调用您。然后必须返回"Remote“。您现在已连接到正在运行的WMP实例。 7)查询COM对象以获得IWMPMedia接口指针 8) (如果7)没有给空,请阅读IWMPMedia::属性。 9)完成 所有这些都是在VS2010 /Windows7和WMP运行时进行的(如果没有媒体播放器进程运行,就什么也不做)。 我不知道yoy是否能够/想在Python中实现COM接口和对象。如果您对我的C++代码感兴趣,请告诉我。您可以在C++ DLL中使用该代码,然后从python中调用它。

我对win32api有一点了解。

在第一步,我真的不知道该做什么,谷歌IOleClientSite结果在msdn文档中,它是一个接口。不过,我已经被困在那里了。在Python中使用这些东西时,我找不到任何东西(可能只是我可怕的googling技巧)。

第二步:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WMP = win32com.client.Dispatch("WMPlayer.OCX")

好吧,这是可行的。

进入第三步。QueryInterface -

“无论您拥有哪个对象,您都可以调用它的QueryInterface()方法来获得一个新的接口,比如IStream。”

来源

不过,对我来说不是。正如我理解他的解释,我认为这意味着每个com对象都从IUnknown“继承”了三种方法,其中之一是QueryInterface,然而,由于在QueryInterface对象上调用QueryInterface失败了,所以情况似乎并非如此。(Object has no attribute 'QueryInterface')

我可以继续说下去,但我相信你明白了,我不知道该如何处理这个问题。有人能帮我解决这个问题吗?最好有代码示例,但也欢迎资源/文档。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-28 12:01:03

几乎是最后的答案,但不能完成。没有C++模块的帮助,我似乎无法使用pythoncom来实现自定义接口。下面是Mark的回答(Mon,2003年1月13日):IDTExtensibility2接口

抱歉-你是索尔。为了支持任意接口,您需要以扩展模块的形式提供C++支持。有一种新的"Univgw“可以帮助你,但我对此知之甚少

我找不到任何关于"Univgw“的东西.

comtypes模块旨在解决这个问题,我找到了一些链接,说明它确实存在,但是我无法让它与我的新的Python3.3一起工作。它是Python2.x代码。comtypes似乎过时了,而且没有维护。

步骤1 IOleClientSite和IServiceProvider的OK,IWMPRemoteMediaServices的KO

步骤2、3、4和5

如果没有IWMPRemoteMediaServices,步骤6、7和8无法实现:-(

免责声明:完整的Python新手,请不要大喊大叫

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pythoncom
import win32com.client as wc
from win32com.axcontrol import axcontrol
import win32com.server as ws
from win32com.server import util
from win32com.server.exception import COMException
import winerror
import pywintypes

# Windows Media Player Custom Interface IWMPRemoteMediaServices
IWMPRemoteMediaServices = pywintypes.IID("{CBB92747-741F-44FE-AB5B-F1A48F3B2A59}")

class OleClientSite:
    _public_methods_ = [ 'SaveObject', 'GetMoniker', 'GetContainer', 'ShowObject', 'OnShowWindow', 'RequestNewObjectLayout', 'QueryService' ]
    _com_interfaces_ = [ axcontrol.IID_IOleClientSite, pythoncom.IID_IServiceProvider ]

    def SaveObject(self):
        print("SaveObject")
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetMoniker(self, dwAssign, dwWhichMoniker):
        print("GetMoniker ")
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetContainer(self):
        print("GetContainer")
        raise COMException(hresult=winerror.E_NOTIMPL)

    def ShowObject(self):
        print("ShowObject")
        raise COMException(hresult=winerror.E_NOTIMPL)

    def OnShowWindow(self, fShow):
        print("ShowObject" + str(fShow))
        raise COMException(hresult=winerror.E_NOTIMPL)

    def RequestNewObjectLayout(self):
        print("RequestNewObjectLayout")
        raise COMException(hresult=winerror.E_NOTIMPL)

    def QueryService(self, guidService, riid):
        print("QueryService",guidService,riid)
        if riid == IWMPRemoteMediaServices:
            print("Known Requested IID, but can't implement!")
            raise COMException(hresult=winerror.E_NOINTERFACE)
        else:
            print("Requested IID is not IWMPRemoteMediaServices" )
            raise COMException(hresult=winerror.E_NOINTERFACE)


if __name__=='__main__':
    wmp = wc.Dispatch("WMPlayer.OCX")
    IOO = wmp._oleobj_.QueryInterface(axcontrol.IID_IOleObject)
    pyOCS = OleClientSite()
    comOCS = ws.util.wrap(pyOCS, axcontrol.IID_IOleClientSite)
    IOO.SetClientSite(comOCS)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19613750

复制
相关文章
package-lock.json和package.json
package-lock.json就是锁定安装时的包的版本号,以保证其他人在npm install时大家的依赖能保持一致。
用户3258338
2019/09/04
2K0
package.json
复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会导致当前项目运行报错
Qwe7
2022/04/21
7000
package.json
每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install 命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
奋飛
2019/08/15
7630
package.json 详解[每日前端夜话0xEF]
Node 项目在项目根目录中名为 package.json 的文件中跟踪依赖关系和元数据。这是你项目的核心。它包含名称、描述和版本之类的信息,以及运行、开发以及有选择地将项目发布到 NPM 所需的信息。
疯狂的技术宅
2019/12/11
2.3K0
npm脚本和package.json
  在创建node.js项目如一个vue项目,或一个react项目时,项目都会生成一个描述文件package.json 。
tandaxia
2019/12/31
1.8K0
package.json文件
项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、 当前项目依赖了哪些第三方模块等。 package.json文件在项目根目录下使用npm init -y命令生成。
星辰_大海
2022/05/10
7620
package.json文件
package.json 知多少?
在 Node.js 中,模块是一个库或框架,也是一个 Node.js 项目。Node.js 项目遵循模块化的架构,当我们创建了一个 Node.js 项目,意味着创建了一个模块,这个模块必须有一个描述文件,即 package.json。它是我们最常见的配置文件,但是它里面的配置你真的有详细了解过吗?配置一个合理的 package.json 文件直接决定着我们项目的质量,本章就带大家了解下 package.json 的各项详细配置。
ConardLi
2019/12/02
1.9K0
【基础】package.json文件详解
每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息。
青年码农
2020/12/17
1.1K0
package.json文件的作用
项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、 当前项目依赖了哪些第三方模块等。 package.json文件在项目根目录下使用npm init -y命令生成。
清出于兰
2020/10/26
2.1K0
package.json文件的作用
package.json文件知多少?
Version: 当前项目的版本,需要满足以下约定 x.x.x - major.minor.patches
用户7365393
2021/09/26
5450
全方位解读 package.json
允许不修改[major, minor, patch]元组中最左边的非零元素的更改 。换句话说,这允许版本1.0.0及以上版本的补丁和次要更新,版本的补丁更新0.X >=0.1.0,以及版本的不更新0.0.X。
@超人
2021/09/17
1.5K0
全方位解读 package.json
package.json 配置完全解读
package.json 是前端每个项目都有的 json 文件,位于项目的根目录。许多脚手架在搭建项目时也会自动帮我们自动初始化好 package.json。
Leecason
2022/12/16
2.8K0
package.json 配置完全解读
package.json文件快速入门详解
相信入门nodejs或者npm的同学会对package.json这个文件有疑惑,对这个文件的作用不是很清晰,但搭建自己的博客每每用到node,npm这个文件又必不可少。
wblearn
2018/08/27
9890
package.json文件快速入门详解
npm脚本获取package.json配置
在执行npm脚本时,可以通过**npm_package_**前缀环境变量获取package.json里的字段 例如:
路过君
2022/04/13
1.3K0
升级package.json中的包
npm-check-updates upgrades your package.json dependencies to the latest versions, ignoring specified versions.
周星星9527
2021/09/30
1.6K0
升级package.json中的包
npm 与 package.json 快速入门
张拭心 shixinzhang
2018/01/05
2.1K0
npm 与 package.json 快速入门
nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
nodejs的package.json定义了一个模块,包括其依赖关系的一个简单的JSON文件,该文件可以包含多个不同的指令来告诉Node包管理器如何处理模块。 dependencies则表示此模块依赖的模块和版本,其中常常可以看到类似 ^1.2.0 或 ~1.2.0 这样的版本范围指示。 首先,一个完整的版本号组表示为: [主要版本号,次要版本号,补丁版本号] 1. 用 ~ 指示范围 版本号中如果指定了主要版本、次要版本,则只允许补丁版本升级; 如果只指定了主要版本,则允许次要版本、补丁版本升级。 ~1.2
蓓蕾心晴
2018/04/12
1.3K0
npm 与 package.json 快速入门教程
npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧!
张拭心 shixinzhang
2019/05/29
2.3K0
npm 与 package.json 快速入门教程
package.json中script的生命周期
package.json 文件是我们每个项目当中必须指定的,我们就以下面的 package.json 为例进行测试
小小杰啊
2022/12/21
8900
package.json中script的生命周期
[译] 如何更新 package.json 中的依赖项
原文:https://medium.com/better-programming/how-to-upgrade-dependencies-in-package-json-e5546804187f
江米小枣
2020/06/15
5.2K0

相似问题

package.json修改包-lock.json

11

查找漏洞源(在package.json中)(包-lock.json)

12

有没有办法从-lock.json包中提取package.json?

248

有没有工具来验证/检查package.json和包-lock.json是否一致?

169

npm要从包中创建一个package.json文件-lock.json文件?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文