拜托各位高人,本人想获得VB中运行中断状态下,已获得句柄窗体的属性值,及其内含所有控件的属性值.

nmd002 2008-05-23 12:12:34
上次发过关于取得VB本地窗体各属性值的帖子,但是未能取得收获.所以结帖另开.希望各位高人,帮忙实现目标.
...全文
270 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nmd002 2008-05-29
关于17楼,“运行中断状态下,程序的源代码你是可以拿的到的啊,那种源码重排的代码里面,肯定有分析变量声明的代码,拿来参考一下就可以那到某个过程下面的所有变量~甚至声明顺序都可以得到~”,在实现上应该是没有太大问题。

虽然我不清楚“源码重排的代码”是指哪种代码,但我现在使用VB的ADDIN开发的时候,发现可以从代码窗体可以查出每个函数的代码分区(就是在VB6代码里每个画了横线的区域都可以用函数查到),就算是对其使用编程来进行管理也没什么问题(这本来就是ADDIN被设计出来的目的)。所以估计取到各种变量对象的声明应该不会很难。从窗体设计画面里,也可以直接到取到全部的窗体、控件对象,但无法在运行中取得属性。缺点是上述功能只能在代码编辑状态下被使用,如果在代码运行中使用了其中一些相关的对象操作,就有可能使运行中止退出。

但是,我从代码编辑器里取到了声明,并不意味着我可以从哪个地方(内存?)照这个列表把值都查到。
我另外发的一个帖子里,有个兄弟说可以考虑用注入线程的方法,把需要监控的进程里指定窗体的线程ID取出来,然后用远程复制线程的方法,把该线程复制到本地进程中,再考虑取值的问题。但是也不一定能有效果。主要是无法实现从线程里取值这一步骤。具体可以参看下面的页面内的讨论:
http://topic.csdn.net/u/20080527/16/285c9b09-cedc-4aaa-936f-10bac387f5f1.html

回复
yinweihong 2008-05-28
不过,你这个问题真的比较难,VB6不是真正的和VB.NET一样全是对象,你要读内存包装成对象也难~

我估计没人有仔细研究过VB6运行时的内存数据模型~...
回复
yinweihong 2008-05-28
运行中断状态下,程序的源代码你是可以拿的到的啊,那种源码重排的代码里面,肯定有分析变量声明的代码,拿来参考一下就可以那到某个过程下面的所有变量~甚至声明顺序都可以得到~
回复
nmd002 2008-05-28
14楼的阿勇,你真是太有才了.不过,兄弟,我需要的是用代码来实现这个功能.首先,我应该如何才能像金山游侠那样把数值的偏移地址取出来呢?

15楼的"请结贴,谢谢!",我也可以肯定的说,本人确实不熟悉API和VB6的运作原理.一下子就让您看出来了,真是叫人无地自容啊,呵呵.我之所以想弄出那些数据,也只不过是为了对窗体运行中断时的数据,进行统计和和检索.因为VB6的本地窗体本身,并未提供一个检索的功能,所以在做复杂一些的数据监控时,要对数据进行全面一些的分析和查找,就只能一下下地点击展开全部节点,手工地去寻找.如果能实现对某个断点上,全部当前数据的取值,那就能大大提高工作效率了.

而"请结贴,谢谢!"在上一帖中的回复,本人也已拜读,但是并不是十分理解其意思."某个过程或者函数执行时,堆栈里的全部的变量的值",我应该如何才能取得到呢?我想来想去没办法实现.在上帖中:"楼主可以注意到当前locals窗口显示的正是Locals里面Edit所指示过程/函数 里面所有的变量的名字和值,里面的变量的顺序正是从该过程开始的变量的压栈顺序,变量的名字好拿到,是值可能比较难拿...."
实话实说,我连变量的名字都拿不到,更别提从里面取值了.而且你后面提过的利用立即窗口以远程控制的方法取得debug.print的值的方法,会不会太儿戏了?因为有些对象的值是不可能直接打印得出来的.而且这样做,在被监控的VB环境中造成的影响可能太多,可能导致影响使用者的正常使用.

在这里非常想请教一下"请结贴,谢谢!",能否给出一点具体的思路,哪怕只是取得"指定函数或过程执行时,堆栈里面的全部的变量的名称".非常感谢!
回复
yinweihong 2008-05-27
我可以肯定的说,楼主你的这个问题基本上用这种途径解决不了

你也不熟悉API和VB6的东西

我实在想不出弄出那个数据有什么用,实际上就是某个过程或者函数执行时,堆栈里面的全部的变量的值啊,上个帖子就跟你说过了
回复
zzyong00 2008-05-27
你可以用如金山游侠之类的软件,搜索到哪个数值的偏移地址,然后用ReadProcessMemory读取
回复
smoked 2008-05-27
mark
回复
nmd002 2008-05-26
请问11楼阿勇,你所提议的这种方法应该如何着手?有没有办法通过VB代码来实现?
我也曾想过通过获取内存来着手解决这个问题,但是本人功力不够,无论是C也好VB也好都没有办法取得这个控件或数组的内存位置和长度,也不知应该按何种类型来读取.如果可以实现,也希望能得到各位的指点
回复
cbm6666 2008-05-23
枚举窗体内所有控件没问题, 可以帮你, 其内含所有控件的属性值, 这个虽然很基楚,但因每个控件的属性太多了, 我想也不会有人那么有空吧, 你总不会要求别人把你里面的Timer1的Interval是多少来写代码给你吧 ? 你上个帖我略过了, 其他很多人也飘过了..........

Dim i%, jj%
Private Sub Command1_Click()
jj = Me.Controls.Count
Me.Cls
For i = 0 To Me.Controls.Count - 1
Print Controls(i).Name '枚举窗体内所有控件名
Next i
End Sub
回复
zzyong00 2008-05-23
建议用搜索内存的方法试试
不知你玩过游戏修改没有?
回复
nmd002 2008-05-23
对的,就是那个窗口,就是那个没句柄的树状控件.我想要的就是里面的内容.我已经探索了各种方法长达两周时间,就是要这些数据.就是搞不定啊.大家帮帮忙吧.
回复
zzyong00 2008-05-23
楼主所说的“本地窗口”是指VB6 IDE “视图”菜单里点“本地窗口” ,出来的窗口
哪个没有HWND,应该是像label一样的轻量控件
回复
舉杯邀明月 2008-05-23
Mark........
回复
nmd002 2008-05-23
原来阁下是用这种方法取得类名的,但是这样一来,各控件与各窗体之间的关系就全都无法分辩了,只能通过最高层的父句柄一层层向下重组父子关系.而且只能取到当前控件的类名,句柄和显示文字值.

我记得TYPEOF()函数是用来子类型化的,这样真的可以取到VB中的窗体类型吗?如果能成功地把运行中的VB窗体转化成本程序可识别的FORM类型(或VBFORM类型)的对象,那就可以通过FORM的容器集合获得此窗体的全控件对象了,那就用不着逐个捕获各控件的句柄了.如果不能转化成为VB代码可识别的窗体或控件对象,那即使取到了句柄也是取不到各属性的.

取到VB的窗体或控件对象的话,我可以按上个帖子里,有位高人提供的取控件全部属性集合的那个例子,把某个控件的全属性一个不漏地取出来.他的方法非常好,我已经试着做了一下,应该说是非常有效果的.非常感谢你的帮助.
回复
cbm6666 2008-05-23
1.先用标题取得主句柄 Phwnd = FindWindow(vbNullString, "CBM666")

2.找到下面所有的子句柄 PhwndChild = GetWindow(lphWnd, GW_CHILD)

3.GetClassName 筛选出以Thunder开头的所有句柄,并发送消息返回 SendMessage(Thwnd, WM_GETTEXTLENGTH, 0, 0) 得到每个子项的的内容

4.各别子项的属性, 呵呵....忘了,记得是用TypeOf..., 晚上研究一下, 弄好后再贴出全部代码.
回复
nmd002 2008-05-23
先请问4楼,你是如何做到的?

从图上可以看出,你取得的确实就是VB6的窗体,窗体中的控件类型也确实是VB6的.确实非常有帮助,能讲解一下你是如何做到的吗?只讲原理也行.

另外,如果我取到了这个运行中窗体的各控件的句柄之后,该怎么做才能取得这些个控件的当前全部属性值呢?就像本地窗体里的那些属性内容.

顺便解释一下:发这个帖是因为上一帖没有解决,而我又连发了三次回复无人回应,系统说我灌水不让我继续表达了所以我才结帖的,其实本次的目的和上一帖的是一样的.早就说过是想取得其他程序的运行中的窗体的全部属性.
回复
cbm6666 2008-05-23
哎, 要说你们这些年轻小伙子, 贴出来的主题是 "关于取得VB本地窗体各属性值"

1F 回答后 3F 却反水为 "外部窗体", 澈底无语......

下图表现的是在目前这个程序去抓取窗口标题为CBM666 ,并列出该程序下所有的 控件与句柄.

可能又误解楼主的意思了吧 ? 一个字 累.


回复
nmd002 2008-05-23
我是想取得其他VB程序在开发环境中运行之后,加断点暂停时,某个窗体的全部属性值,也就是本地窗口中显示出的那些内容,程序运行中的某个时刻的窗体的全部属性值.我想把这些值对全检索出来,并且做一个输出.也就是监控运行中的VB程序的某个窗体全部的属性值.

1楼的那种方法恐怕对我想要达到的目标来说,没什么意义.因为我需要首先获得那个窗体,然后从外部获取全部属性,并不是在程序内获得.也就是说我的代码不是为当前工程使用的,而是为其他工程开发时使用的.

上个帖子里,有人提了个很好的建议,建议我使用VB的ADDIN编程,这样在任何工程里,都可以像本地工程一样使用许多可用方法.但是现在我只能做到:自己编写的ADDIN窗体在运行中断状态下也可显示出来,并可以正常使用;但是一旦使用VBComponer.Desinger方法取得指定设计窗体中的控件对象全部属性,就会使运行(或者运行中断)状态被强制取消.返回到VB编辑开发的状态.

这样一来,运行中的程序的窗体的属性就取不到了,取到的永远都只是设计窗体中设定的属性值.所以本人非常不甘心,又重新发帖来请教此事.
回复
m60a1 2008-05-23
不知道LZ这么做有什么意义..............
枚举本地的有什么意思呢!!
回复
发帖
API
创建于2007-09-28

1461

社区成员

VB API
申请成为版主
帖子事件
创建了帖子
2008-05-23 12:12
社区公告
暂无公告