如题。本人已用VB6+API制作了一段有效的代码,可以捕捉到VB6的“本地”窗体的句柄,经验证已取得句柄正确。
但是本人却无法将“本地”窗体中的那个树状控件的句柄捕捉到。试验证明SPY++也查不到这个控件的句柄。本人至今未能查到这个控件是什么类名(classname),属于哪个类型,也不知道如何才能取得其中的各个键值对。好像在VB6中也没有一种对应的控件是这个类型的。本人写这段程序的目的是,为了捕捉其他外部VB程序中调试时的“本地”窗体中的数据(变量名,值,类型),并希望能用层级结构制作数据的清单。如果有高人能够做到:
1:能用VB+API,取得其他程序VB6的“本地”窗体中已展开树的所有键值对,就算没有层级关系也行。
2:告知此树状控件是什么类型或类名,其运作的原理是什么。
3:通过该窗体句柄从进程中取得其内存数据,并转化为可用的VB对象。只要三个问题中可以回答出任何一个,并且经本人试用确实有效,就可得分。
如嫌少,可另外再给。
请各位高人指教,洗耳恭听。
但是本人却无法将“本地”窗体中的那个树状控件的句柄捕捉到。试验证明SPY++也查不到这个控件的句柄。本人至今未能查到这个控件是什么类名(classname),属于哪个类型,也不知道如何才能取得其中的各个键值对。好像在VB6中也没有一种对应的控件是这个类型的。本人写这段程序的目的是,为了捕捉其他外部VB程序中调试时的“本地”窗体中的数据(变量名,值,类型),并希望能用层级结构制作数据的清单。如果有高人能够做到:
1:能用VB+API,取得其他程序VB6的“本地”窗体中已展开树的所有键值对,就算没有层级关系也行。
2:告知此树状控件是什么类型或类名,其运作的原理是什么。
3:通过该窗体句柄从进程中取得其内存数据,并转化为可用的VB对象。只要三个问题中可以回答出任何一个,并且经本人试用确实有效,就可得分。
如嫌少,可另外再给。
请各位高人指教,洗耳恭听。
所有的无窗口控件的内容都是在容器窗口上直接绘出来的,所以不可能按句柄方式进行访问。
典型代表:组件中添加 Microsoft Forms 2.0 Object Library,里面的任何一个控件放在窗体上,都找不到句柄的。
1:VB6里面的那个树状结构的控件倒底是不是TreeView或者ListView,仍然无法确定,需要再探讨。
2:另外,这个控件有些麻烦。它与TREE有区别,它可以有多个根节点,用追加新对象的操作,就可以加入新的根。就算是TREE好像也只能找到一个根节点吧?
您所提的"VB-Addin",和"VBE对象下的WINDOWS集合"都是怎么用的?能不能再多给一点提示。
Microsoft Forms 2.0 Object Library
在我的VB引用中为什么没看到呢?
MSDN中查找“VBE 对象”
这个控件的句柄的确没找到.如果它真是一个控件,那应该也是轻量控件...像LABEL一样绘上去的~~而不是用createwindow根据某个类生成的.....
如果是样,你的方向可能要改改,如赵老虎所说,写个ADDIN吧~~~
如果不能,恐怕你的程序也不能。
你确信Microsoft Forms 2.0 Object Library引用成功了吗?
引用后,工具箱中增加很多像常规控件一样的控件,比如:listbox,commandbutton,combox等.
我点击了“引用”,在“浏览”中指定C:\WINDOWS\SYSTEM32\FM20.DLL,然后在选单中该项打挑。但是什么也没出现。
我再重新点击“引用”,结果里面我已经打过挑的那项“Microsoft Forms 2.0 Object Library ”前面的挑不见了。
请问“老鸟”这是什么原因啊。
1:ADDIN的主要功能,怎么看都是针对VB编辑环境中的代码视窗和设计视窗为主来制作的。其他视窗都只做为点缀,可用的功能主要是设焦点和关闭窗口。
2:虽然我写的代码暂时还没有运行成功,没有看到运行效果。但是,取不到本地窗体中的任何控件已经是肯定的了。因为在阅读过MSDN后,发现VBE对象(就是整个VB代码编辑的窗体对象)下的各个小视窗,就是本地窗口、立即窗口之类的小窗体,全都是通过一个集合对象(VBIDE.WINDOWS类)来管理的,而其中的每个项目(VBIDE.WINDOW类),就只有那么少的可怜的操作方法和属性。根本就没办法得到这个窗口内的任何控件。估计是微软早就考虑到有人会想直接从他们的窗口里取值,所以就根本没有打算开放这些窗体内控件,使之作为可操作内容。
3:我想要获得的是本地窗体的数据信息,而本地视窗的数据,都是在运行中断,也就是调试时才出现数据的。从例子中的代码看,他是把运行时(包括运行中断时)的窗体都隐藏了。能否在调试状态下显示这个窗体,目前由于未修改其代码进行测试,所以目前说不上是否能够在调试状态下显示和有效运行。
http://topic.csdn.net/u/20080518/21/88464e5e-3768-490a-80c0-7bd51cfa3c6e.html
不知道楼主到底想做什么...但是很明显,你现在从拿到窗口句柄,然后去拿那些值的路已经走死拿值的另外一个思路:楼主可以注意到当前locals窗口显示的正是Locals里面Edit所指示过程/函数 里面所有的变量的名字和值
里面的变量的顺序正是从该过程开始的变量的压栈顺序,变量的名字好拿到,是值可能比较难拿....
或者 直接扫描VB6的栈...再去分析,难度更大
楼主可以说明一下到底想做什么,大家帮你看看,也不至于走如此...
呵呵,一定要做的话,呵呵,拿到变量的名字后到立即窗口里面debug.print 拿值~...
现将本人的目标再重新声明一下:
本人想通过一段程序,实现指定VB开发环境下,某个运行中的VB程序的各项数据(包括变量、对象及其值)。而且现在主要是想把“本地窗口”内的那个树状结构中所显示出的数据,做为输出的主要来源。也就是说,执行某VB程序之后,在运行中中断,通过本地窗口所监控到的数据(名称、值、类型),都想当作内容做一个输出(甚至是按层级的定位或查询,当然那是在树状结构可控的前提下才行),以供使用者方便地查找和监控变量的值。本人首先使用的方法是捕获该窗口句柄的方法,结果是可以捕获该窗体,可以捕获窗体中除树状控件以外的其他控件的句柄和值。老鸟的解释是:有些控件是直接进行绘制的,因此此类控件是没有句柄可供捕获的。所以本人基本放弃了这种获得数据的思路。接下来,根据老鸟和诸位高人的提议,本人研究了ADDIN的使用。本指望通过微软封装的类,取得本地窗体,并将其内所含控件取得后,再加利用。谁知微软不地道,他们没有留下操作窗体内任何控件的途径和方法。所以本人当时考虑,如果还是不能取得控件中的各名称和值的话,只好自己写一个类似本地窗体的ADDIN。用本地窗口的表现形式做一个仿品,功能仿照本地窗口中的树状结构来显示各对象,点击节点,伸缩树枝。然后在其上扩展自己的输出功能,把已经展开的节点中的全部属性名和值都做为输出的内容。但是最后的这种想法,会涉及到几个问题,尚待解决:
1:ADDIN方式建立的窗口,在运行中断的情况下,是否能取得运行中某个控件的各属性及其值。看过前面(lsftest)给出的那篇文章,多少对取得某控件的全部属性有了信心。但是对在运行中断时的控件对象的取得,因为没有测试过,仍不敢确定。
2:ADDIN窗口在运行中断的情况下,是否能正常显示,还没有经过测试。如果ADDIN无法在中断情况下显示,那最后的这个想法也只能放弃了。
3:还有一个功能控件的问题。本地窗口的树状控件,看来很简单,但是却包含了许多一般控件没有的功能。比如随时可以在其中添加新的对象或变量,并对其从属的属性进行同样的树状伸缩。也就是说这个控件不是一般的树,只有一个根,他可以有多个根,每个单独的根都可以伸缩,也是个极其难以模仿的控件。另外,“(yinweihong)请结贴,谢谢!”在回复中提到的“直接扫描VB6的栈...再去分析,难度更大”,我也很感兴趣。能否介绍一下思路或者方法,使本人可以在此基础上,拓展一下思路。也许这个问题看着难,解决起来其实很容易。关键是本人的技术水平仍然很有限,思维还不够活跃,才无法脱离已知的条条框框的束缚。希望各位有识之士,能够提出更有创意的思路和方法来。本人感激涕零,热烈盼望各位不吝赐教。
现在我认为ADDIN在VB6里的主要作用,只能是作为编码的辅助用窗口,连参与调试的可能性都没有。不能满足我的开发需求。但愿我的判断是错误的,可以有哪位高人出来指正一下。请问现在还有哪位高人,有办法能帮我获得VB本地窗体中的数据吗?求大家帮忙顶帖。我还是不死心!
通过typelib information(tlbinf32.dll)动态分析对象的属性,属性值,动态调用成员函数...