如何在运行的Visual Basic 6.0进程(例如MSVBVM60.DLL)中运行Visual Basic代码?

时间:2011-02-21 16:36:16

标签: c++ vb6

我正在调试传统的Visual Basic 6.0应用程序;应用程序内置于本机代码中,但不幸的是我们只有二进制文件,但没有源代码。所以,就程序的修改而言,我相当有限。

我的最终目标是在给定HWND的情况下获取某些控件的“Name”属性的值。我可以轻松编写VisualBasic代码来执行此操作,但遗憾的是我没有看到如何在正在运行的应用程序的上下文中执行此代码。

我的第一次尝试是在VisualBasic中创建一个ActiveX DLL,它暴露了我的'controlNameForHWND'函数。在运行时,我有一个小实用程序向VB运行进程注入了第二个辅助DLL,然后帮助DLL调用CoCreateInstance,以便我的ActiveX控件(其中包含我在VB中编写的'controlNameForHWND'函数)是在应用程序的过程中实例化。

这很好用,但不幸的是,ActiveX控件显然没有在与要调试的应用程序相同的上下文中执行。例如,全局App.hInstance值不同,全局Forms数组返回的数组始终为空,依此类推。所以我的所有VisualBasic脚本代码都在并行Universe中运行。厄运。 : - /

有没有其他人有想法如何能够将VisualBasic代码“注入”VB6进程?使用Process Explorer查看进程显示已加载库MSVBVM60.DLL(Microsoft Visual Basic虚拟机),但不是VBA.DLL。后者会很有趣,因为它导出一个未记录的EbExecuteLine函数来执行脚本语句。

我的想法有点低,所以我也很感激最疯狂的想法。 : - )

1 个答案:

答案 0 :(得分:2)

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

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