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