比如:
procedure buttonclick(sender:Tobject);
var
   do:String;
Begin
   do:='showmessage('你好,你是高手')';
   // 怎样把'你好,你是高手'这个字符串显示出来end

解决方案 »

  1.   

    这在DELPHI中不太可能吧?以前用FOXBASE中倒有类似的功能。
    你能不能说说你具体要实现什么功能,看有不有其它什么方法。
      

  2.   

    Component->Import ActiveX Control->Microsoft Script Control
    //添加ActiveX控件MS Script ControlScriptControl.Language:='VBScript';//也可以是JScript等ScriptControl.ExecuteStatement('MsgBox("你好,你是高手")');//执行脚本
      

  3.   

    运行期的代码??不编译怎么执行?除非是vbscript或者javascript之类的……
      

  4.   

    此言差异,如果直接填充机器代码到内存中,很容易实现运行其间动态生成代码并执行利用VirtualAlloc分配虚拟内存,并指定这块内存为可读写并可执行,然后在该块内存中加入代码(机器语言),利用嵌入ASM跳转到刚才分配的内存地址,执行其中动态加入的代码相应汇编代码对应的机器代码
    mov eax : $B8
    call : $E8
    ret : $C3type
      PCode = ^TCode;
      TCode = packed record
        Code: array[0..2] of Byte;
        Prc: Pointer;
        Ret: Byte;
      end;
    var
      Block:PCode;Block:=VirtualAlloc(nil, 11, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    Block^.Moveax:=$B8;//mov eax
    Str:='你好,你是高手';
    Block^.Str:=Pointer(PChar(Str));//字符串地址
    Block^.Call:=$E8;//Call
    Block^.Prc:=Pointer(Longint(@ShowMessage) - (Longint(@Block^.Call) + 5));//计算Showmessage的相对地址
    Block^.Ret:=$C3;//Ret动态生成的代码为:
    mov eax,[字符串地址]
    call ShowMessage
    ret//执行
    asm
    call Block//Block指向动态生成代码的首地址
    end;
      

  5.   

    foxpro宏功能的阴灵永垂不朽!
      

  6.   

    foxpro宏功能的阴灵永垂不朽!
    是解释的啊
    怎么可能搬到编译的程序里
      

  7.   

    http://www.torry.net/scripts.htm
    上面有很多控件可以以pascal形式写script,
    并由该控件解释执行,
    并且有不少是开发源码的,
    即使你不想用别人的东西,
    也可以拿来参考一下
      

  8.   

    此言差异,如果直接填充机器代码到内存中,很容易实现运行其间动态生成代码并执行利用VirtualAlloc分配虚拟内存,并指定这块内存为可读写并可执行,然后在该块内存中加入代码(机器语言),利用嵌入ASM跳转到刚才分配的内存地址,执行其中动态加入的代码相应汇编代码对应的机器代码
    mov eax : $B8
    call : $E8
    ret : $C3type
      PCode = ^TCode;
      TCode = packed record
        Code: array[0..2] of Byte;
        Prc: Pointer;
        Ret: Byte;
      end;
    var
      Block:PCode;Block:=VirtualAlloc(nil, 11, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    Block^.Moveax:=$B8;//mov eax
    Str:='你好,你是高手';
    Block^.Str:=Pointer(PChar(Str));//字符串地址
    Block^.Call:=$E8;//Call
    Block^.Prc:=Pointer(Longint(@ShowMessage) - (Longint(@Block^.Call) + 5));//计算Showmessage的相对地址
    Block^.Ret:=$C3;//Ret动态生成的代码为:
    mov eax,[字符串地址]
    call ShowMessage
    ret//执行
    asm
    call Block//Block指向动态生成代码的首地址
    end;
    呵呵,高。
      

  9.   

    楼上的程序不能通用啊,如果不是showmessage呢?如果是dll函数入口呢?如果是多参数呢?如果函数是一个宏,根本没有入口,。。还不如进行判断:
    if text ='showmessage' then showmessage(string);
    呵呵另,对想自己做编译器的同志表示敬意啊!
      

  10.   

    在这里http://richsearch.com/index.html输入 "宏替换" 搜索
    你会找到很多解决方案
      

  11.   

    调用DLL中的函数可以用GetProcAddress,参数的传递要看调用约定,参数多了用栈,写个简单的编译器那有那么难,大学的编译原来白学了?当然如果要开发一个优秀的编译器要考虑的问题很多!我写出来的代码当然是调试成功才贴出来了的!当然没推荐要这么做,只是为了说明运行期间也可以动态生成执行代码,是为了说明问题才贴出来的!
      

  12.   

    楼上说的是,上面代码贴错了type
      PCode = ^TCode;
      TCode = packed record
        Moveax: Byte;
        Str: Pointer;
        Call: Byte;
        Prc: Pointer;
        Ret: Byte;
      end;
    var
      Block: PCode;
      Str: String;Block:=VirtualAlloc(nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    Block^.Moveax:=$B8;//mov eax
    Str:='你好,你是高手';
    Block^.Str:=Pointer(PChar(Str));//字符串地址
    Block^.Call:=$E8;//Call
    Block^.Prc:=Pointer(Longint(@ShowMessage) - (Longint(@Block^.Call) + 5));//计算Showmessage的相对地址
    Block^.Ret:=$C3;//Ret//调用
    asm
    call Block//Block指向动态生成代码的首地址
    end;