首页 果壳精灵教程 当前文章

【新手入门】第 16 讲:COM组件调用

xLeaves(xxrpa) 发布于 2022年06月24日 18:47:14


COM接口是一种通用的跨语言调用接口,他能被几乎所有编程语言所调用,并且在各个平台上保持高度的一致性。

这种接口现在用的已经越来越少,濒临淘汰了,但如果你使用果壳精灵进行游戏脚本开发,则调用COM接口的能力至关重要。

因为许多游戏脚本开发插件都是以COM组件的形式提供的,例如:大漠插件。


COM组件是一种面向对象的组件模型,对象,是COM组件调用的最小单位,想要调用COM组件,首先必须创建出这个COM组件对应的对象。

创建一个COM对象的方法非常简单,使用 CreateObject 函数即可,这里以系统自带的 wsh 为例:

Function Main() As Long
	Dim wsh As Object = CreateObject("WScript.Shell")
	TracePrint wsh.Version
End Function

COM对象固定使用【Object】数据类型,通过 CreateObject 函数传递一个 ProgID 即可创建,根据这个 ID 的不同,创建出的对象也有所不同。

COM对象创建成功后,即可调用这个对象的方法,读写这个对象的属性了。

COM对象的 ProgID 是什么?它有哪些属性和方法?这就需要去查阅对应组件的开发商提供的用户手册了,例如大漠插件,就提供了非常全面的帮助文档。

微软提供的用于 Excel、Word 等软件自动化的COM组件,也可以通过其网站查询到对象的模型。


如果我们创建的是一个系统自带的COM组件,那会非常容易,但如果一个COM组件系统没有自带,是你提供的,那么在创建它之前,你必须将它注册到系统。

因为 ProgID 是写在注册表里的,当 ProgID 在注册表里不存在的时候,就算你的COM组件DLL和程序放在一起,程序也找不到它。

相比其他脚本开发工具,果壳精灵注册一个COM组件相当简单,这里以大漠插件为例(当然,果壳精灵封装了大漠插件扩展库,会自动注册,这里仅演示,如果你没有 dm.dll 这个范例是无法正确运行的哦):

Function Main() As Long
	RegCom(APP_ScriptPath & "dm.dll")
	Dim dm As Object = CreateObject("dm.dmsoft")
	TracePrint dm.Ver()
End Function

能把 COM 组件注册到系统,自然也能把它从系统里取消注册,但通常这个操作不是必须的:

Function Main() As Long
	UnRegCom(APP_ScriptPath & "dm.dll")
End Function


除了最常用到的 CreateObject 外,我们还可以用 GetObject 获取正在运行的 COM组件对象,例如 Excel,拿到软件的操控权,实现自动化处理数据。

GetObject 的用法和 CreateObject 类似,都是传入一个 ProgID,获得一个 COM组件对象。这里以 SAP 为例,为了确保例程能够正确运行,你的机器必须安装了 SAP,并且软件已经启动:

Function Main() As Long
	Dim gui As Object = GetObject("SAPGUI")
	Dim sap As Object = gui.GetScriptingEngine()
	TracePrint sap.majorVersion()
End Function


当 COM 对象不再使用的时候,要记得释放,不然占用的内存得不到释放,会导致你的程序内存占用量越来越大,这是一个良好的编程习惯。

释放 COM 对象可以使用 ReleaseObject 命令:

Function Main() As Long
	Dim gui As Object = GetObject("SAPGUI")
	Dim sap As Object = gui.GetScriptingEngine()
	TracePrint sap.majorVersion()
	ReleaseObject(sap)
	ReleaseObject(gui)
End Function

若无特殊声明,上述内容为本站原创,未经授权禁止转载!