Delphi 列出现有对象以读取和更改其属性的理想方法是什么?

Delphi 列出现有对象以读取和更改其属性的理想方法是什么?,delphi,automation,Delphi,Automation,我正在尝试在DelphiXe2中开发一个应用程序,它将能够在不同的应用程序之间读取和更改对象属性 目前,我们唯一的目标应用程序是一个用Delphi XE开发的应用程序,我有源代码,还有一个用VB6开发的应用程序,我们没有源代码或信息 我们正在寻找的主要对象是标签和编辑,但理想情况下,我几乎需要设计一个对象查看器,列出每个对象及其属性,能够随意读取和更改这些对象,并调用方法 我不知道如何做到这一点,我得到的最好的结果是能够读取一些标签标题,基于读取VB应用程序上的缓冲区和直接处理内存分配,但即使这

我正在尝试在DelphiXe2中开发一个应用程序,它将能够在不同的应用程序之间读取和更改对象属性

目前,我们唯一的目标应用程序是一个用Delphi XE开发的应用程序,我有源代码,还有一个用VB6开发的应用程序,我们没有源代码或信息

我们正在寻找的主要对象是标签和编辑,但理想情况下,我几乎需要设计一个对象查看器,列出每个对象及其属性,能够随意读取和更改这些对象,并调用方法

我不知道如何做到这一点,我得到的最好的结果是能够读取一些标签标题,基于读取VB应用程序上的缓冲区和直接处理内存分配,但即使这样也有它的局限性,因为它只在WinXP中工作,而不像预期的Windows 7

实现我想要的最好方式是什么?如果最好的话,我愿意用另一种语言编写代码

编辑:在做了更多的研究之后,我发现TestComplete,它有一个对象查看器,基本上可以列出/修改对象及其属性。
由于目标不是使用第三方软件来做这件事,很明显这是可行的,但我不知道如何做。MSAA/IAutomation在一定程度上起作用,但两者都不能真正列出所有对象

下面是几个屏幕,简要说明它是如何工作的(使用第三方VB应用程序,为安全起见,编辑了部分):


使用RTTI和Indy TidTCPServer,向任何Delphi应用程序添加一个基于文本的、类似telnet的对象浏览器/编辑器都非常容易。我已经在几个应用程序上完成了这项工作,组织了表单和组件结构,使容器显示为“文件夹”,组件显示为“文件”。它可能有用。。而且很有趣。对于用户来说,当他们的应用程序突然改变面前的颜色,或者逐渐变得越来越高越来越薄时,这有点令人不安。我收到的bug报告很有趣,(不,你说得对,我不应该这么做,即使是对营销经理)

我不明白为什么基于表单的浏览器不能用树视图构建。单击组件节点可以打开一个表单,该表单列出属性并允许对其进行编辑。IIRC,我只能这样调用已发布的方法

OTOH,我不知道如何有效地使用VB应用程序。VB不是我喜欢在没有足够保护的情况下使用的东西,那些危险品防护服很不舒服。

列出现有对象并读取/修改其属性的理想方式是什么?

没有什么比理想的方式更好的了。要么您了解应用程序并与之有一些接口(或者从内部了解),要么您必须遵守可用的内容。如果您的目标是具有通用Windows控件的Windows应用程序,那么您需要的就是Windows API

但是,并不是您在屏幕上看到的所有控件都可以通过Windows API访问,不幸的是,标签就是其中之一。一般来说,只有窗口控件(具有句柄的控件)可以通过Windows API访问

如何创建对象查看器,列出(外部应用程序的)每个对象及其属性,能够读取和修改这些属性并调用对象的方法。

对象列表(从Windows API的角度来看)非常简单,您需要从要检查的目标应用程序获取窗口的句柄,并枚举其子窗口(或者最好这次调用它们的组件),代码如下。
但是,从这种枚举中只能得到两个相关的东西——组件句柄及其类名。每个组件实例都有自己的、在同一时间唯一的系统范围标识符和由类名标识的类类型。

可以说,这很酷,我可以获得系统范围的组件标识符和类类型,因此我可以通过发送组件的特定Windows消息来控制整个宽窗口中的每个组件,但是…
世界上有谁会想到,对于以相同方式处理和响应相同消息的组件,类名可能会有所不同?

好吧,你的噩梦被称为子类化,它允许开发人员在新类名下用新功能扩展现有组件。作为一个杰出的例子,可以使用基本的Windows编辑框类
edit
和我们的Delphi子类类型
TEdit
。两者都可以由同一组消息控制,并且行为相同,但从您的角度来看,这只是另一个障碍,因为您必须记住,如果您找到具有
TEdit
类类型的组件,则必须像
编辑
类组件一样对其进行控制

现在您知道了具有特定句柄的组件是什么类型,剩下的就是选择可以与该组件类型一起使用的正确函数集(消息)。你所需要的一切都可以在地图上找到。有所有可用的通用控制函数,包括用于获取或设置某些组件属性的函数,最好是浏览这些函数


关于调用外部应用程序对象方法。幸运的是,这是不可能的,我甚至不想想象恶意软件或写得不好的应用程序在没有任何限制的情况下从一个进程到另一个进程调用其他函数可能会导致什么情况。

此外,对于WinAPI,您可以使用Microsoft Active Accessibility从其他窗口获取信息。下面是一个小例子:和delphi代码:

谢谢你的建议,但不幸的是,VB应用程序在我需要的东西上扮演着巨大的角色。你真的在问如何修改控件属性并向没有源代码的VB应用程序添加新行为吗?认真地