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

时间:2012-04-10 20:35:46

标签: delphi automation

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

目前,我们唯一的目标应用程序是在Delphi XE中开发的应用程序,我有源代码,在VB6中完成,我们没有源代码或信息。

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

我对如何这样做感到茫然,我得到的最好的是能够读取一些标签标题,基于读取VB应用程序上的缓冲区并直接处理内存分配,但即使这样也有它的局限性,因为它只适用于WinXP,而不是Windows 7。

实现我想要的最好方法是什么?如果最好的话,我愿意用不同的语言编写代码。

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

以下是几个屏幕,简要介绍它是如何工作的(使用第三方VB应用程序,编译安全部分):

TestComplete Object Browser TestComplete Object Browser 2

3 个答案:

答案 0 :(得分:6)

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

没有什么比理想的方式更好。要么你知道应用程序并有一些接口(或从内部知道)或你必须符合可用的。如果您的目标是具有常见Windows控件的Windows应用程序,那么您正在寻找Windows API。

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

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

对象列表(从Windows API的角度来看)非常简单,您需要从要检查的目标应用程序中获取窗口的句柄并枚举其子窗口(或者更好地将它们称为组件时间),代码为this one
但是你可以从这种枚举中获得的唯一两个相关的东西 - 组件句柄和它的类名。每个组件实例都有自己的,一次唯一的系统范围标识符和由类名标识的类类型。

可以说,这很酷,我可以获得系统范围的组件标识符和类类型,因此我可以通过发送组件的特定窗口消息来规定整个Windows中的每个组件,但是......
世界上哪些人会期望对于以相同方式处理和回应相同消息的组件,类名可能会有所不同?

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

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

关于调用外部应用程序对象方法。幸运的是,这是不可能的,我甚至不想想恶意软件或编写错误的应用程序可能会导致什么原因导致彼此从一个进程调用另一个进程而没有任何限制。

答案 1 :(得分:5)

除WinAPI外,您还可以使用Microsoft Active Accessibility从其他窗口获取信息。这是一个小例子:http://blogs.msdn.com/b/oldnewthing/archive/2004/04/23/118893.aspx和delphi代码:http://www.transl-gunsmoker.ru/2009/08/blog-post.html

答案 2 :(得分:1)

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

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

OTOH,我不知道如何有效地使用VB应用程序。在没有足够保护的情况下,VB不是我喜欢接近的东西,而且这些危险品套装都不舒服。