既然控件都可以动态生成,那可否动态生成代码?
例如:运行时动态生成一个函数或过程,生成以后还可以调用?

解决方案 »

  1.   


    http://www.csdn.net/Develop/Read_Article.asp?Id=19413
      

  2.   

    应该可以,不过需要一个解释引擎。例如MSScript控件。
    动态执行代码。
      

  3.   

    可以的。你甚至可以从你的程序中生成另外一个程序。。
    例如,你要生成dos下的format.com命令文件。可以先用一些二进制编辑软件把一个现成的format.com打开,然后把它的内容以二进制文本的方式记录下来,当然,这样的文本看起来是没有什么意义的,而且大部分都是不可打印的字符。但你不必管它,只管把它记录下来。然后在你的vb程序中把刚才记录下来的东西以二进制的形式一字不漏地输出到一个新文件newformat.com中去。这样,你就得到了一个新的format文件了。同样道理,一些大一点的文件甚至vb的可执行文件在理论上都可以通过这种方法先由二进制编辑软件分析记录,再把数据加插到你的程序中去。最后当你运行这个载体程序的时候就会生产出一个新的文件。而且在理论上,新的文件与旧的文件功能上是完全一样的,关键是你记不记得了这么多毫无意义的文本。而一种变通的方法是把旧文件做成载体程序的资源文件,然后想生成新文件的时候就直接从资源文件中读数据然后输出到新文件。这样的做法优点是不用做分析记录等繁琐的步骤,缺点是载体程序会变得体积庞大。
    是不是觉得我说的比你想的更异想天开更荒诞不经????但我在dos时代,却亲眼看过有人用差不多的思路,用人手键盘输入,以copy con more.com, copy con sys.com之类的形式硬生生的生成了一些dos命令文件,直看得我目瞪口呆,叹为观止但在window时代我就没有再听说过有人这样了,也许行不通的也说不定。由于没有经过实践,只是不负责任地瞎说一通,所以上面才有那么多的“理论上”
      

  4.   

    我的意思是:新生成的代码作为我正在运行程序的一部分,而不是生成一个独立新文件实体!
    MSScript控件,我去查查!
      

  5.   

    lihonggen0:不知道你有没有做过类似的事情,我发现只能运行一些简单的语句和函数,如要运行自定义的函数,还要传递参数,不知可否实现?
      

  6.   

    我想做的事情是:
    我的程序中事先定义了一组变量:
    dim a,b,c,d as single
    在运行中动态生成了代码,假设动态生成的代码放在code$(可以从文件中读取获得)中:
    code$="a=1:b=2:c=3:d=4"
    运行code$中的代码以后,变量a,b,c,d就被赋值了!
    各位看可以做到吗?
      

  7.   

    可以,不过效率要低的多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
      

  8.   

    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
      

  9.   

    我想做的事情就是从文件读取一系列的“赋值语句”,用Ebexecutline执行一下就实现对程序中的变量赋值!如果不能做到这一点,我就必须从文件中读取“赋值字串”,然后做繁琐串操作,匹配程序中的对应变量,才能实现赋值,很繁琐且效率不高。
      

  10.   

    还是研究一下SCRIPT控件比较好。
      

  11.   

    to lesong(lesong) 
    我很奇怪,你的变量命名可以用相应数组
    一个数组放变量名
    一个数组放变量没有必要如你那样命名
      

  12.   

    to:yefanqiu(叶帆)
    或者我举这样一个例子:
    有两个变量:  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$是那些赋值语句,结果就只影响这些参数。
      

  13.   

    好像不是什么新想法吧。
    以前听一个高手说过,有一种语言就是这样的,他是在执行时才编译的,借以跨平台。有点走题,这确实时软件的一个发展方向。现在一些设计工具,象rose都可以将流程图翻译成相关的语言代码。这应该看成时向这方面前进吧。
      

  14.   

    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
      

  15.   

    to (叶帆): 
    谢谢,你的意思我明白!我之所以想动态执行代码,就是想避免if strName(i)=abc$判断,因为如果文件中有很多参数的话,每个参数都要判断若干次。 
    有空的话看看我下面这个帖子:
    http://expert.csdn.net/Expert/topic/2154/2154627.xml?temp=.121731
      

  16.   

    to lesong(lesong) 
     你的问题,用集合可以很好的解决你的问题,你的帖子已回复。
      

  17.   

    to yunok(杨云鹏)运鹏兄太谦虚了,大家一起交流么!
      

  18.   

    可以的,这些要人为的控制一下程序的执行路径,先在内存中分配一点空间放生成的代码,然后修改堆栈里的返回地址,当然在被调用的代码中,也要有返回地址的,这个返回地址是原来被修改的返回地址,意思是说当一个函数返回时,就调用了动态生成的代码,执行完后就返回原来的程序执行.如原来是A->B->A  动态生成C,现在修改堆栈后,就变成了A->B->C->A的调用方式了。
    自己没有去试过,但看过这方面的书,应该可以的,因为有很大有名的程序,都这样做的,包括一些病毒程序和黑客程序。
    祝你好运了。
      

  19.   

    好的,谢谢各位关注。现在稍微有点忙,晚上结贴。
    还有一问to (叶帆): 
    确实可以用集合解决。但有人说用集合会大大降低系统性能,效率很低。不知道用集合后跟我以前用的select case结构比起来谁的效率高些,如果比那个效率还低,那就违背了我的初衷了!