可以的。你甚至可以从你的程序中生成另外一个程序。。 例如,你要生成dos下的format.com命令文件。可以先用一些二进制编辑软件把一个现成的format.com打开,然后把它的内容以二进制文本的方式记录下来,当然,这样的文本看起来是没有什么意义的,而且大部分都是不可打印的字符。但你不必管它,只管把它记录下来。然后在你的vb程序中把刚才记录下来的东西以二进制的形式一字不漏地输出到一个新文件newformat.com中去。这样,你就得到了一个新的format文件了。同样道理,一些大一点的文件甚至vb的可执行文件在理论上都可以通过这种方法先由二进制编辑软件分析记录,再把数据加插到你的程序中去。最后当你运行这个载体程序的时候就会生产出一个新的文件。而且在理论上,新的文件与旧的文件功能上是完全一样的,关键是你记不记得了这么多毫无意义的文本。而一种变通的方法是把旧文件做成载体程序的资源文件,然后想生成新文件的时候就直接从资源文件中读数据然后输出到新文件。这样的做法优点是不用做分析记录等繁琐的步骤,缺点是载体程序会变得体积庞大。 是不是觉得我说的比你想的更异想天开更荒诞不经????但我在dos时代,却亲眼看过有人用差不多的思路,用人手键盘输入,以copy con more.com, copy con sys.com之类的形式硬生生的生成了一些dos命令文件,直看得我目瞪口呆,叹为观止但在window时代我就没有再听说过有人这样了,也许行不通的也说不定。由于没有经过实践,只是不负责任地瞎说一通,所以上面才有那么多的“理论上”
我想做的事情是: 我的程序中事先定义了一组变量: dim a,b,c,d as single 在运行中动态生成了代码,假设动态生成的代码放在code$(可以从文件中读取获得)中: code$="a=1:b=2:c=3:d=4" 运行code$中的代码以后,变量a,b,c,d就被赋值了! 各位看可以做到吗?
可以,不过效率要低的多Option Explicit' ¶ÔÓÚ VB6 Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As Long' ¶ÔÓÚ Access 97/VBE.dll clients like Word 97 and Excel 97 ' Private Declare Function EbExecuteLine Lib "vba332.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As LongPrivate Function ExecuteLine(sCode As String, Optional fCheckOnly As Boolean) As Boolean ExecuteLine = EbExecuteLine(StrPtr(sCode), 0&, 0&, Abs(fCheckOnly)) = 0 End Function Private Sub Combo1_Click() Text1 = Combo1.Text End SubPrivate Sub Command1_Click() Dim res As Boolean res = ExecuteLine(Text1.Text) End Sub Private Sub Form_Load() ' Chr$(34)ÊÇË«ÒýºÅ Combo1.AddItem "Var = msgbox(" & Chr$(34) & "¿´µ½ÁË£¿ºÜºÃÓá£" & Chr$(34) & " & vbCrLf & " & Chr$(34) & "ÊÇ·ñ¼ÌÐøʵÑé?" & Chr$(34) & ", vbYesNo + vbInformation)" & ":" & "If var = vbNo Then End" Combo1.AddItem "shell " & Chr$(34) & "calc.exe" & Chr$(34) & ",vbNormalFocus" Combo1.AddItem "msgbox SecretFunction(2,2),vbInformation" Combo1.AddItem "Form1.BackColor = vbRed" Combo1.AddItem "var = 3^2 + sin(3.1415926/4):msgbox var" Combo1.ListIndex = 0 End Sub
yefanqiu(叶帆) :你好,我是说动态执行的代码能否与动态代码外的变量传值? 例如: Private Sub Command1_Click() Dim res As Boolean dim var as single res = ExecuteLine("var=1.7:msgbox var") '这里面msgbox引用var可以成功(=1.7) msgbox var '这里仍然是var=0!!!我想要的就是这里var也被赋值1.7 End Sub
to lesong(lesong) 我的意思是对 dim DEN as single ,EMI as single,你直接定义为数组 如 dim v(100) as single dim strName(100) as string - 存放名称 ,它两一一对应 如果:a$="DEN=1.2,EMI=11.7", for i=1 to 100 if strName(i)=abc$ then v(i)=变量值 abc 为从a$取得的变量名,变量值也是从a$取得 next
to (叶帆): 谢谢,你的意思我明白!我之所以想动态执行代码,就是想避免if strName(i)=abc$判断,因为如果文件中有很多参数的话,每个参数都要判断若干次。 有空的话看看我下面这个帖子: http://expert.csdn.net/Expert/topic/2154/2154627.xml?temp=.121731
http://www.csdn.net/Develop/Read_Article.asp?Id=19413
动态执行代码。
例如,你要生成dos下的format.com命令文件。可以先用一些二进制编辑软件把一个现成的format.com打开,然后把它的内容以二进制文本的方式记录下来,当然,这样的文本看起来是没有什么意义的,而且大部分都是不可打印的字符。但你不必管它,只管把它记录下来。然后在你的vb程序中把刚才记录下来的东西以二进制的形式一字不漏地输出到一个新文件newformat.com中去。这样,你就得到了一个新的format文件了。同样道理,一些大一点的文件甚至vb的可执行文件在理论上都可以通过这种方法先由二进制编辑软件分析记录,再把数据加插到你的程序中去。最后当你运行这个载体程序的时候就会生产出一个新的文件。而且在理论上,新的文件与旧的文件功能上是完全一样的,关键是你记不记得了这么多毫无意义的文本。而一种变通的方法是把旧文件做成载体程序的资源文件,然后想生成新文件的时候就直接从资源文件中读数据然后输出到新文件。这样的做法优点是不用做分析记录等繁琐的步骤,缺点是载体程序会变得体积庞大。
是不是觉得我说的比你想的更异想天开更荒诞不经????但我在dos时代,却亲眼看过有人用差不多的思路,用人手键盘输入,以copy con more.com, copy con sys.com之类的形式硬生生的生成了一些dos命令文件,直看得我目瞪口呆,叹为观止但在window时代我就没有再听说过有人这样了,也许行不通的也说不定。由于没有经过实践,只是不负责任地瞎说一通,所以上面才有那么多的“理论上”
MSScript控件,我去查查!
我的程序中事先定义了一组变量:
dim a,b,c,d as single
在运行中动态生成了代码,假设动态生成的代码放在code$(可以从文件中读取获得)中:
code$="a=1:b=2:c=3:d=4"
运行code$中的代码以后,变量a,b,c,d就被赋值了!
各位看可以做到吗?
Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As Long' ¶ÔÓÚ Access 97/VBE.dll clients like Word 97 and Excel 97
' Private Declare Function EbExecuteLine Lib "vba332.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As LongPrivate Function ExecuteLine(sCode As String, Optional fCheckOnly As Boolean) As Boolean
ExecuteLine = EbExecuteLine(StrPtr(sCode), 0&, 0&, Abs(fCheckOnly)) = 0
End Function
Private Sub Combo1_Click()
Text1 = Combo1.Text
End SubPrivate Sub Command1_Click()
Dim res As Boolean
res = ExecuteLine(Text1.Text)
End Sub
Private Sub Form_Load()
' Chr$(34)ÊÇË«ÒýºÅ
Combo1.AddItem "Var = msgbox(" & Chr$(34) & "¿´µ½ÁË£¿ºÜºÃÓá£" & Chr$(34) & " & vbCrLf & " & Chr$(34) & "ÊÇ·ñ¼ÌÐøʵÑé?" & Chr$(34) & ", vbYesNo + vbInformation)" & ":" & "If var = vbNo Then End"
Combo1.AddItem "shell " & Chr$(34) & "calc.exe" & Chr$(34) & ",vbNormalFocus"
Combo1.AddItem "msgbox SecretFunction(2,2),vbInformation"
Combo1.AddItem "Form1.BackColor = vbRed"
Combo1.AddItem "var = 3^2 + sin(3.1415926/4):msgbox var"
Combo1.ListIndex = 0
End Sub
例如:
Private Sub Command1_Click()
Dim res As Boolean
dim var as single
res = ExecuteLine("var=1.7:msgbox var") '这里面msgbox引用var可以成功(=1.7)
msgbox var '这里仍然是var=0!!!我想要的就是这里var也被赋值1.7
End Sub
我很奇怪,你的变量命名可以用相应数组
一个数组放变量名
一个数组放变量没有必要如你那样命名
或者我举这样一个例子:
有两个变量: dim DEN,EMI as single
两变量初值: DEN=33.7:EMI=1.25
现在有一个字符串a$(从文件中读出来),从a$中去读取参数值赋给定义的同名变量:
例如:
1.如果:a$="DEN=1.2,EMI=11.7",赋值后结果应该为:DEN=1.2:EMI=11.7
2.如果:a$="EMI=80",仅给定DEN值,则赋值后结果: DEN=1.2(仍为初值): EMI=80
我文件中读出来的串可能只对部分变量赋值,而不是所有变量的都赋值,没有赋值的仍然为初始值!我的意思是想“按名赋值”,a$中没有赋值的变量,我就不管它。如果我能实现动态执行代码且传参数的话:我读出来的a$是那些赋值语句,结果就只影响这些参数。
以前听一个高手说过,有一种语言就是这样的,他是在执行时才编译的,借以跨平台。有点走题,这确实时软件的一个发展方向。现在一些设计工具,象rose都可以将流程图翻译成相关的语言代码。这应该看成时向这方面前进吧。
我的意思是对 dim DEN as single ,EMI as single,你直接定义为数组
如 dim v(100) as single
dim strName(100) as string - 存放名称 ,它两一一对应 如果:a$="DEN=1.2,EMI=11.7",
for i=1 to 100
if strName(i)=abc$ then v(i)=变量值 abc 为从a$取得的变量名,变量值也是从a$取得
next
谢谢,你的意思我明白!我之所以想动态执行代码,就是想避免if strName(i)=abc$判断,因为如果文件中有很多参数的话,每个参数都要判断若干次。
有空的话看看我下面这个帖子:
http://expert.csdn.net/Expert/topic/2154/2154627.xml?temp=.121731
你的问题,用集合可以很好的解决你的问题,你的帖子已回复。
自己没有去试过,但看过这方面的书,应该可以的,因为有很大有名的程序,都这样做的,包括一些病毒程序和黑客程序。
祝你好运了。
还有一问to (叶帆):
确实可以用集合解决。但有人说用集合会大大降低系统性能,效率很低。不知道用集合后跟我以前用的select case结构比起来谁的效率高些,如果比那个效率还低,那就违背了我的初衷了!