【问题标题】:How can I run Visual Basic code in a running Visual Basic 6.0 process (e.g. MSVBVM60.DLL)?如何在正在运行的 Visual Basic 6.0 进程(例如 MSVBVM60.DLL)中运行 Visual Basic 代码?
【发布时间】: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:事实上,我真的只是想读取ControlName 属性的值,它由hWnd 标识。这是一个简单的 GUI 自动化系统的一部分,它重复用户操作来触发错误。为了可靠地识别控件,我们希望使用控件的内部名称。 GUI测试工具也可以使用相同的方法,例如WinRunner(不幸的是我不知道他们是怎么做到的)。
  • 您是否查看过免费的 GUI 自动化工具,例如 AutoIt?也许它可以满足您的需求?

标签: c++ vb6


【解决方案1】:

VB6 ActiveX DLL在客户端进程中运行,但它无权访问客户端进程的Forms 集合。我认为App.hInstance 应该返回相同的值。

如果您在 VB6 IDE 调试器中调试 DLL,导致它在单独的进程中运行。那个调试器做了一些疯狂的事情。您最好从 ActiveX DLL 构建 PDB 文件并在 Visual C++ 调试器中进行调试。

【讨论】:

  • +1 您真的无法在 VB6 IDE 中执行您的操作并对其进行调试。对于这类事情,您几乎只能使用良好的 ol 日志文件和 msgbox 形式的调试。
猜你喜欢
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多