【发布时间】:2011-02-22 01:11:44
【问题描述】:
我正在调试旧版 Visual Basic 6.0 应用程序;该应用程序内置于本机代码中,但不幸的是我们只有二进制文件,但没有源代码。所以我对程序的修改比较有限。
我的最终目标是在给定 HWND 的情况下获取某些控件的“名称”属性的值。我可以轻松编写 VisualBasic 代码来执行此操作,但不幸的是,我看不到如何在正在运行的应用程序的上下文中执行此代码。
我的第一次尝试是在 VisualBasic 中创建一个 ActiveX DLL,它公开了我的“controlNameForHWND”函数。在运行时,我有一个小实用程序将第二个辅助 DLL 注入到 VB 运行进程中,然后该辅助 DLL 调用 CoCreateInstance 以便我的 ActiveX 控件(具有我在 VB 中编写的 'controlNameForHWND' 函数)在内部实例化申请流程。
这很好用,但不幸的是,ActiveX 控件显然没有在与要调试的应用程序相同的上下文中执行。比如全局App.hInstance值不同,全局Forms数组返回的数组总是空的,等等。所以我所有的 VisualBasic 脚本代码都在平行宇宙中运行。厄运。 :-/
还有其他人知道如何将 VisualBasic 代码“注入”到 VB6 进程中吗?查看使用Process Explorer 的过程表明库MSVBVM60.DLL 已加载(Microsoft Visual Basic 虚拟机),但不是例如VBA.DLL。后者会很有趣,因为它会导出一个未记录的 EbExecuteLine 函数来执行脚本语句。
我的想法有点少,所以我也很感谢最疯狂的想法。 :-)
【问题讨论】:
-
你的实际目标是什么?肯定不会获得
Name属性,当然您需要以某种方式更改应用程序的行为。您能否简要描述一下您想到的问题和解决方案 -
@Anonymous close voter,我不同意这个问题“过于本地化”。请不要在没有评论的情况下投票关闭。
-
@MarkJ:事实上,我真的只是想读取
Control的Name属性的值,它由hWnd标识。这是一个简单的 GUI 自动化系统的一部分,它重复用户操作来触发错误。为了可靠地识别控件,我们希望使用控件的内部名称。 GUI测试工具也可以使用相同的方法,例如WinRunner(不幸的是我不知道他们是怎么做到的)。 -
您是否查看过免费的 GUI 自动化工具,例如 AutoIt?也许它可以满足您的需求?