注册 登录
编程论坛 VB6论坛

VB获取过程中的内容

opelwang 发布于 2015-04-10 10:39, 1637 次点击
VB中,如何获取指定模块或类模块中,指定过程的全部内容。

比如:模块1中有这样一个过程:

public sub 测试程序()
....
...
...
end sub


我要获取这个测试程序过程的全部内容,输出到窗体Textbox控件中。

最好能写个自定义函数,方便调用,效果如下:

text1.text=定义函数(过程名)

求指点,谢谢!

[ 本帖最后由 opelwang 于 2015-4-10 10:42 编辑 ]
28 回复
#2
wmf20142015-04-10 10:41
我也想知道。
#3
风吹过b2015-04-10 11:38
好吧,你去搜索一下 C 里面一个著名的题目
如何把自身的源代码显示出来的。

你这个问题与那个例示。我也很想知道如何解决的。
#4
opelwang2015-04-10 11:52
感谢版主来参与。

顶一下贴,期待有高手帮忙解决,谢谢!
#5
lianyicq2015-04-10 11:55
回复 楼主 opelwang
能不能把要求描述清楚一些。
是不是理解为风吹过B版主所说的程序在运行过程中显示模块中代码?
VB在编译过后,还有模块那样的源代码吗?
模块中的文本是固定不变的,有必要在程序运行时去读取?不如直接把模块的文本装入一个隐藏文本框,再按要求显示你需要的部分。
#6
opelwang2015-04-10 12:14
以下是引用lianyicq在2015-4-10 11:55:42的发言:

能不能把要求描述清楚一些。
是不是理解为风吹过B版主所说的程序在运行过程中显示模块中代码?
VB在编译过后,还有模块那样的源代码吗?
模块中的文本是固定不变的,有必要在程序运行时去读取?不如直接把模块的文本装入一个隐藏文本框,再按要求显示你需要的部分。



定义函数(模块名过程名

如:

定义函数(模块1,测试程序),即调用模块1中,测试程序过程中的所有内容。

定义函数(模块1),即调用模块1中,所有内容。

目的:将获取的内容,输出到窗体textbox控件中或txt文件中。

我这样说,不知道版主能理解吗?

[ 本帖最后由 opelwang 于 2015-4-10 12:17 编辑 ]
#7
lianyicq2015-04-10 12:39
回复 6楼 opelwang
这样能方便加入以前开发工程中模块中的代码,是为了满足开发方便的需求吧,并不是查看当前运行工程的模块代码?
这样的话,就是打开模块文件,搜索指定过程名的字符串,提取指定过程名的代码段。
#8
opelwang2015-04-10 12:51
以下是引用lianyicq在2015-4-10 12:39:29的发言:


这样能方便加入以前开发工程中模块中的代码,是为了满足开发方便的需求吧,并不是查看当前运行工程的模块代码?

答:确实是为了开发方便的需求。

这样的话,就是打开模块文件,搜索指定过程名的字符串,提取指定过程名的代码段。

答:应该是在当前的运行程序中,搜索指定的模块名、过程名。而不是打开已存在硬盘中的模块。



不知道这样解释,版主能理解吗?

望帮忙,谢谢!
#9
chen35232015-04-10 13:09
破解?我花了半年时间学习,没学到东西,魔高一尺道高一丈。有专业书介绍。
#10
opelwang2015-04-10 13:49
以下是引用chen3523在2015-4-10 13:09:44的发言:

破解?我花了半年时间学习,没学到东西,魔高一尺道高一丈。有专业书介绍。


你误会了,仔细看看,不是破解哦。
#11
wp2319572015-04-10 13:54
使用ida 抓的函数代码  和原来代码也相差甚远

所以 楼主的要求 基本难以实现
#12
lianyicq2015-04-10 14:01
回复 8楼 opelwang
答:应该是在当前的运行程序中,搜索指定的模块名、过程名。而不是打开已存在硬盘中的模块。
比如正在开发的工程名是"工程1","工程1"中有command1、text1和text2控件,还有一个module1模块,module1中有一"sub 测试"。运行后,在text1中输入"module1"和"sub 测试",点击command1,text2中就显示"sub 测试"的内容?


#13
opelwang2015-04-10 16:41
回复 12楼 lianyicq
意思差不多了。
先试试能不能实现,谢谢。
#14
renxiaoyao362015-04-11 12:00
到底什么意思啊我也凌乱了
代码应该是固定的吧?不需要再用函数读取源代码啊。
另外代码都是会被VB编译的不可能被读取啊。
除非,你是要做个EXE,以后源代码丢了后可以运行EXE看源代码
这样也没必要函数啊,直接将源代码复制黏贴到TEXT1.TEXT中就可以了啊
搞不懂……
#15
lianyicq2015-04-13 12:56
回复 13楼 opelwang
初始想法是抓VB开发环境下module的句柄。module下的名为“通用”和“声明”的combobox或是...bar控件都能找到,但就是没发现module下的代码编辑窗口,有兴趣你可以继续试试。
但VB下的mz-tools插件确实能对开发环境进行操作,这应该是终极解决办法,希望能象OFFICE系列一样,VB也能对自身进行操作。这种操作需要应用程序在VB开发环境中运行。正在尝试...
#16
opelwang2015-04-14 08:19
以下是引用lianyicq在2015-4-13 12:56:48的发言:

初始想法是抓VB开发环境下module的句柄。module下的名为“通用”和“声明”的combobox或是...bar控件都能找到,但就是没发现module下的代码编辑窗口,有兴趣你可以继续试试。
但VB下的mz-tools插件确实能对开发环境进行操作,这应该是终极解决办法,希望能象OFFICE系列一样,VB也能对自身进行操作。这种操作需要应用程序在VB开发环境中运行。正在尝试...


如何实现不了,也可以曲线救国。

把代码封装到一个DLL文件中,再调用这个DLL文件中指定模块或类模块部分内容全部内容

可行否?请指点,谢谢!
#17
lianyicq2015-04-14 10:05
生成DLL文件也要编译生成,编译后不可能还原VB6开发界面下的代码。你参考http://www.
这个插件例子能统计代码行数,可以考虑按这个线索来继续。
#18
opelwang2015-04-14 10:45
回复 17楼 lianyicq
原则上讲,能统计行数,就能汇出代码,也应该可以汇出指定过程(开始行,结束行)之间的内容才对呀。
#19
lianyicq2015-04-14 10:48
我想也是,所以才说按这个线索来继续。你可以下载mz-tools来实际试试它的功能。
...
Set SourceComponent = VBInstance.VBProjects.Item(Text1.Text).VBComponents.Item(Text2.Text)
Text3.Text = SourceComponent.CodeModule.Lines(1, SourceComponent.CodeModule.CountOfLines)
这样可以把指定模块的代码读入到addin的text3.text文本框
...

[ 本帖最后由 lianyicq 于 2015-4-14 11:32 编辑 ]
#20
lianyicq2015-04-14 13:33
测试成功了。
可以把模块中的代码取出并放到指定的textbox中。就是用vbide对象。
你按这思路做下去,有具体问题再说。
#21
opelwang2015-04-14 13:34
以下是引用lianyicq在2015-4-14 13:33:07的发言:

测试成功了。
可以把模块中的代码取出并放到指定的textbox中。就是用vbide对象。
你按这思路做下去,有具体问题再说。


非常感谢版主!

能否上传一个实际的示例呢?谢谢!
#22
lianyicq2015-04-14 13:36
回复 21楼 opelwang
程序代码:
Public VBInstance As VBIDE.VBE
Public Connect As Connect

Option Explicit

Private Sub CancelButton_Click()
    Connect.Hide
End Sub

Private Sub Command1_Click()
Dim SourceComponent As VBComponent
Dim comp As VBComponent
Dim ctrl As VBControl
Dim DESTForm As VBForm
Dim DESTTextBox As VBControl
Set SourceComponent = VBInstance.VBProjects.Item(Text1.Text).VBComponents.Item(Text2.Text)
Text3.Text = SourceComponent.CodeModule.Lines(1, SourceComponent.CodeModule.CountOfLines)

For Each comp In VBInstance.ActiveVBProject.VBComponents
    Text3.Text = Text3.Text & vbCrLf & comp.Name
    If (comp.Type = vbext_ct_VBForm And comp.Name = Text5.Text) Then Set DESTForm = comp.Designer
   
Next
For Each ctrl In DESTForm.ContainedVBControls
    Text3.Text = Text3.Text & vbCrLf & ctrl.Properties("Name").Value & "[" & ctrl.ClassName & "]"
    If ctrl.Properties("Name").Value = Text4.Text Then ctrl.Properties("Text") = Text3.Text
Next


End Sub

Private Sub Form_Load()

End Sub

Private Sub OKButton_Click()
    MsgBox "外接程序操作作用于: " & VBInstance.FullName
End Sub
只有本站会员才能查看附件,请 登录
ADDIN窗体如ReadCode窗体
#23
wmf20142015-04-14 13:46
厉害!这不是破解exe获得的吧。
#24
opelwang2015-04-14 14:26
回复 22楼 lianyicq
上传个附件(VB源码)吧,我弄了半天,没整好。

今天喝了几杯,有点小晕,看代码晕晕的.

谢谢!

[ 本帖最后由 opelwang 于 2015-4-14 14:32 编辑 ]
#25
lianyicq2015-04-14 14:51
这个比较偏,用得不多,说了用VBIDE,应该自己找找VBIDE相关资料。
再送你一程,
新建一“外接程序”工程,Form1代码原样粘贴上贴代码。Form1上控件按图中ReadCode窗体建。
指定窗体的代码取出来后,后续的完善就容易了。
#26
opelwang2015-04-14 14:59
回复 25楼 lianyicq
好, 谢谢版主指点,自己摸索一下。

能告诉我做哪些引用吗,现在都无法编译。
#27
lianyicq2015-04-14 15:01
新建“外接程序”工程,会自动引用。
#28
opelwang2015-04-14 16:41
回复 27楼 lianyicq
还是没弄好。

外接程序编辑的结果是DLL文件,然后....

版主,能上传一个附件吗?谢谢。

另外,指示一下操作及调用方法,谢谢。
#29
lianyicq2015-04-14 16:52
编译后的dll文件放在vb目录下,改windows目录下的vbaddin.ini文件
在未尾加ReadCode.Connect=0
打开VB6,点"外接程序"下的"外接程序管理器",加载ReadCode.
加载后,"外接程序"下出现"My AddIn".点就可以用了.

[ 本帖最后由 lianyicq 于 2015-4-14 17:24 编辑 ]
1