在动态调用DLL时,用函数指针调用,但是必须首先定义函数格式于调用函数一样的函数指针类型,有没有不需要定义函数指针格式的方法

解决方案 »

  1.   

    呵呵例如以前 :
     TMethod=procedure(smsg:string);
    var 
      pMethod=TMethod;
    begin.......
      p("Test");end;我要达到的效果是var
      p:pointer;
    begin
      ........ //得到函数地址
      p(smsg);//不要函数格式直接调用
    end;
    也就是去掉定义函数格式
      

  2.   

    上面有错误哈例如以前 :
     TMethod=procedure(smsg:string);
    var 
      pMethod:TMethod;
    begin.......
      p('Test');end;我要达到的效果是var
      p:pointer;
    begin
      p:=........ //得到函数地址
      p('test');//不要函数格式直接调用
    end;
    也就是去掉定义函数格式 TMethod=procedure(smsg:string);直接定义一个pointer类型就可以调用方法
      

  3.   

    不行吧,你的到的是dll的地址吧,如果对外开了好几个函数呢? 系统怎么知道你调用那个函数啊
      

  4.   

    感觉你调用dll中的函数代码有问题,一般应该这样写
    var
      Fun:Function(i:integer):integer;//定义一个函数指针
      dllHandle:Handle;//dll句柄
      i:integer;
    begin
      dllHandle:=LoadLibrary('mydll.dll');//装入dll
      @Fun:=GetProcAddress(dllHandle,'dllFun');//获得dll中需调用的函数地址并赋给函数指针
      i:=Fun(10);//调用函数
    end;你写的
    var
      p:pointer;
    begin
      ........ //得到函数地址
      p(smsg);//不要函数格式直接调用
    end;
    p只是一个无类型指针,p(smsg)连编译都通不过,至少要
    TMethod(p)(smsg)才行
      

  5.   

    爱的眼睛: 我就是想 将C#和java中的反射机制 放到Delphi下,这样可以简便开发,你有好的思路吗?    还有朋友提议,直接使用ASM来处理这块,但是自己水平太差,一直没尝试这块!
      

  6.   

    >>这样可以简便开发,你有好的思路吗?
    >>直接使用ASM来处理这块以前大富翁 类似的问题,讨论过,不过,也只是自己做多一个函数,来处理不定参数的字节数的导入问题,感觉技术学习可以,但不大实用,至于 反射机制, 这个和我以前接触的概念,应用还有点区别,我也没深入学习, 也许,可从这里找到解决的方法
      

  7.   

    up我用汇编压栈,可以直接调用到某个dll文件中的函数入口,当完成一系列的处理后,调用Call 时出错,,,真不知道为什么!To :(三角小眼睛又邪又媚又笨又呆又奸又诈又色)   你想不想把你自己写的exe,dll不需要编译,拼装在一起,就可以为一个新项目服务呢???
      

  8.   

    OOP的虚方法就是用来干这活的。
    建议找一下OOP的编译原理方面的资料。
      

  9.   

    赫赫,,,你说的用接口吧,,但是万一你拥有的exe,dll有些不是符合oop规范的呢??怎么调用??谢谢
      

  10.   

    我觉得还是参数入栈及清除地问题,你获取了函数的入口地址但没有获取它的参数列表,而编译器处理的dll调用时候有他的固定格式,如__cdcel声明的调用等。