我正在尝试编写一个工具,让我检查基于PowerBuilder的应用程序的状态。我正在考虑的是像Spy ++(或者更好的,“Snoop”,因为它存在于.NET应用程序中),它允许我检查一些基于PowerBuilder的GUI的对象树(和对象的属性)。
我已经为普通(基于MFC)的应用程序以及.NET应用程序做了同样的事情,但不幸的是我自己从未在PowerBuilder中开发过应用程序,所以我现在通常会考虑两个问题:
是否有一些API(最好是Java或C / C ++)可以让人们遍历 PowerBuilder应用程序的可视对象树?我在PowerBuilder Native Interface系统上读了一下,但似乎这是用C / C ++编写PowerBuilder扩展,然后可以用PowerBuilder脚本语言调用,对吧?
如果有一些可用的API - 也许PowerBuilder应用程序甚至会暴露某种支持IPC的API,这使我可以检查PowerBuilder对象层次结构的状态而不在PowerBuilder应用程序的进程中?也许有可用的自动化界面,或基于COM的东西 - 或者其他东西?
现在,我的印象是可能需要将一个DLL注入到PowerBuilder应用程序的进程中,然后获得对正在运行的PowerBuilder VM的访问权限,以便我可以查询它以获取对象树。然后,某种IPC机制将允许我将此信息传输出PowerBuilder应用程序的过程。
有没有人有这方面的经验,或者可以说明是否有人试图这样做?
致以最诚挚的问候,
答案 0 :(得分:6)
首先,答案很简单:我认为你要做的事已经完成了。 Rex from Enable做了我认为你想要的事情,但是IIRC与开发人员交谈时,它依赖于应用程序内置的代码钩子。
这导致了一个建议,即我认为你不能做我认为你试图从应用程序完全外部做的事情。您可以使用WinAPI获取窗口句柄并使用它执行一些基本操作,但不是您想要的。使用WinAPI获取有关DataWindows的信息?算了吧。
我相信我听说过一个类似你要问的API,但我从来没有听说过任何其他自动化测试软件工具制造商开始使用它。如果这是真的(并且这些信息的质量与“在走廊里听到它”一致),我怀疑可能存在一些应用程序安全问题。 (我知道你永远不想感染我的应用程序,或者四处寻找我的秘密。 grin )
即使挂钩进入PowerBuilder VM内存空间,我也不知道能够在没有一些PowerScript框架挂钩的情况下获取内存中的对象列表(例如,在每个打开的构造函数和对象句柄上填充列表)。一旦你有了一个窗口句柄,就可以轻松遍历它的控制数组(及其子类控制数组)来获取窗口上的对象列表,但是像NVO实例变量句柄这样的东西会有问题。
我很佩服这个主意。我希望我有更好的消息(除了Rex可能解决你的问题,而不会自己做头痛)。现在我更期待伊兰可能释放的东西! 笑容
祝你好运,特里。
答案 1 :(得分:3)
我刚刚创建了这样一个工具,但我有点作弊。实际上我自己也要在PB新闻组上提出同样的问题。我的解决方案由两部分组成:
类似Spy的工具 - 一个像Spy ++一样的独立应用程序,即允许您使用Windows API函数将目标拖动到控件上(尽管用PB编写)。
目标应用程序的内部基础架构 - 位于所有应用程序窗口的祖先位置。一旦给定某个(windows)句柄,它就会通过Control []数组并查找其句柄与给定句柄匹配的控件。如有必要,它还可以递归到控件容器中,例如制表符。
当用户选择控件时,间谍工具首先使用Windows API查找其包含的窗口。找到后,该工具会向该窗口发送自定义消息,然后由应用程序的基础架构处理。然后控件位于PB应用程序中,其细节最终被发送回间谍工具,该工具将它们呈现给用户。
我怀疑基础架构部分可以用一些外部东西替换,因为我已经看到了似乎能够做到这一点的工具(Visual Expert,QTP)。但是,我没有时间进一步研究,这个解决方案相对容易开发。
我必须说,你的问题出现了令人惊讶的时机。见this recent question of mine。如果您对我创建的工具感兴趣,请给我发表评论。