delphi - 如何检查 OCX 接口中的方法是否可用
问题描述
目前,我在我们的产品中嵌入了一个 OCX,使用标准样板 Delphi 导入 OCX。供应商发布了新版本的 OCX,它对所有内容(对象和接口)使用完全相同的 GUID,但 API 有所更改。这些更改非常有限,但我很难找到一种可靠的方法来确定已安装的 OCX 是使用旧版本还是新版本。显而易见的方法是深入到接口中,并检查对象实例化后是否可以使用特定方法。我想通过实际询问对象特定方法的调度 ID 来查看它是否存在来做到这一点。
我不想使用调用新方法并获取异常的方法,因为对象在初始化之前将无法工作,并且初始化 API 是发生变化的事情之一。这意味着在初始化之前对新方法的任何调用都将失败。
有谁知道戳穿 Delphi 包装器并找出是否可以解决特定方法的正确方法是什么?
解决方案
答案实际上在您的问题中:
我想通过实际询问对象特定方法的调度 ID来查看它是否存在来做到这一点。
OCX 对象实现了IDispatch
接口,并IDispatch
有一个GetIDsOfNames()
方法用于返回对象的方法和属性的调度 ID(用于与 一起使用IDispatch.Invoke()
)。如果对象不知道请求的名称,则GetIDsOfNames()
返回DISP_E_UNKNOWNNAME
。
推荐阅读
- java - 执行“org.hibernate.internal.SessionFactoryImpl()”构造函数时出现“AbstractMethodError”错误
- python - 处理 JSON 响应、编辑和发送
- vue.js - Vue.js 路由在刷新时发送到 404
- python - 在 playbook 上使用 Ansible for netstat 命令和格式
- assembly - 如何在程序集文件中包含另一个文件?
- javascript - 将数组转换为具有相同输入名称的对象javascript
- javascript - 如何检查是否
- 元素具有特定值
- c# - EF Core 和 MySQL - “CREATE DATABASE” Sql 命令给出错误:您的 SQL 语法有错误
- python-3.x - 使用 Pandas 在 Jupyter 笔记本中选择数据集中的不同行
- javascript - 是否有mongoose model.translateAliases 函数的逆函数