Python 中使用 Win32Exts 扩展调用 ActiveX控件 示例

续接前文:

https://blog.csdn.net/tan_kaishuai/article/details/97893739

 

本文主要演示如何使用 Python 操作一个实际的ActiveX控件。

目标控件为“五虎大战”棋类小游戏,可在这里获取下载:

https://github.com/tankaishuai/My_ActiveX_DLL_MIX_DEV/blob/master/ActiveX/Tigers5.ocx

 

示例如下:

Python 中使用 Win32Exts 扩展调用 ActiveX控件 示例

 

首先导入:win32exts 并初始化 API 列表及 COM 环境:

>>> import win32exts
>>> win32exts.load_sym("*", "*")
>>> win32exts.CoInitialize(0)

 

指定控件的显示位置,以及显示参数(SW_SHOW):

>>> win32exts.co_push_start()
>>> win32exts.push_bstr("0,0,600,500")        ‘可选项
>>> win32exts.push_value(1)                         ‘可选项

 

开始创建控件对象:

>>> ax = win32exts.create_ax_object("工程2.Tigers5", -1)      ’如果想将控件创建在指定位置,第2个参数传入父窗口句柄

 

然后控件即显示出来了:

Python 中使用 Win32Exts 扩展调用 ActiveX控件 示例

 

调用控件方法: ax.Ax_ListSym() 显示控件有哪些方法或者属性:

>>> print win32exts.co_invoke(ax, "Ax_ListSym", True)
----Function----
QueryInterface=1610612736(1)
AddRef=1610612737(1)
Release=1610612738(1)
GetTypeInfoCount=1610678272(1)
GetTypeInfo=1610678273(1)
GetIDsOfNames=1610678274(1)
Invoke=1610678275(1)
CaptionLBL=1745027076(get)(0)
CaptionLBL=1745027076(put)(0)
CaptionBTN=1745027075(get)(0)
CaptionBTN=1745027075(put)(0)
ImgTiger=1745027074(get)(0)
ImgTiger=1745027074(put_ref)(0)
ImgDragon=1745027073(get)(0)
ImgDragon=1745027073(put_ref)(0)
ImgShow=1745027072(get)(0)
ImgShow=1745027072(put_ref)(0)

 

可见空间有一个标签文本属性:CaptionLBL,支持读写操作。下面获取其内容:ax.get_CaptionLBL()

>>> print win32exts.co_get(ax, "CaptionLBL", True)
     加油啊!!!

 

下面我们修改这个属性,亦即:ax.put_CaptionLBL( newVal )

>>> win32exts.co_push_start()
>>> win32exts.push_bstr("~~~ new caption ~~~")
>>> win32exts.co_put(ax, "CaptionLBL")

界面变化为:

Python 中使用 Win32Exts 扩展调用 ActiveX控件 示例

 

可见已经正确修改。

下面调用控件的方法 Ax_ShowWindow() 隐藏控件:

【Ax_*** 开头几个固有的方法为 win32exts提供, 所有控件均有!】

>>> win32exts.co_push_start()
>>> win32exts.push_value(0)       ' SW_HIDE
>>> win32exts.co_invoke(ax, "Ax_ShowWindow", True)

 

如果我们想要销毁控件:

>>> win32exts.co_release(ax)
1

返回值为 1,可见控件仍未销毁。事实上,该控件依旧被 win32exts 环境引用了一次。

 

如果再次调用:

>>> win32exts.co_release(ax)
0

ActiveX控件即被销毁。但是不建议这样重复释放操作,正确的做法如下:

>>> win32exts.delete_ax_object("工程2.Tigers5")
0

告诉 win32exts 环境不再引用该控件对象。