请求思路,一个DELPHI程序要调用DLL,而DLL中的函数名,参数个数,参数类型为不定,要调用的DLL中的函数名、参数个数、参数类型要可以在窗口中Edit中动态输入我的意思就是函数不能在程序中事先定义,因为一切都是不固定的,要根据手工输入的
参数个数、参数类型来调用这个函数,有些函数是3个参数,有些函数是4个参数
手工输入如下:
函数名:abcd 
参数1:a1 string型  
参数2:a2 integer型 
参数3:a3 boolean型
。。
//参数个数:不定 参数类型:不定要根据这些东西来调用这个函数

解决方案 »

  1.   

    那么你的DLL也是不确定的,这个DLL必须随时来生成,嘿嘿
      

  2.   

    你说的是什么呀?
    我看你不是调用dll的问题,
    而是你建dll的问题
      

  3.   

    动态调用 winapi : LoadLibrary ; GetProcAddress
      

  4.   

    Delphi是做不到了,不过,你可以在Delphi中用汇编来实现
      

  5.   

    动态调用dll,并且自己用汇编负责参数的压栈。。应该不难。。
      

  6.   

    参数都不定,DLL怎么写出来呢?
      

  7.   

    不知DLL中的函数可不可以有缺省值?
      

  8.   

    可以用在Dll中export的第几个函数
      

  9.   

    我可能大概明白楼主的意思了
    楼主大概想这样:
    (出于测试一个dll的原因)一个一个的调用dll的函数,dll中的函数是知道的,但是出于某些原因,我们想手动调用这些函数(而不是loop结构自动调用).
    显式装入dll的过程正如meshwork(白开水)同志所说,使用LoadLibrary和GetProcAddress因为其中的参数是pchar,那么我们可以通过某种方法来完成上述的要求
     
     
      

  10.   

    我想关键是函数指针类型要定义成不同类型就比较麻烦,如果dll提供得函数类型有限那么预先全部定义好久也可以了.如果函数全部要动态那就麻烦大了!!!!或者真的需要用汇编使用手动的压栈方式!!!!!看来是比较麻烦!!!
      

  11.   

    有一个牵强的办法,就是所有的dll的export的入口参数全部使用数组作为参数,如
    procedure MyFun1(args:array[] of pointer);
    procedure MyFun2(args:array[] of pointer);
    procedure MyFun3(args:array[] of pointer);
    每个函数的第一件事情是从数组中取出需要的数据.
    在调用dll的函数里,定义函数指针就比较容易
     type  PMyFun=procedure(args:array[] of pointer);
    ...
      dllHandle:=LoadLibrary("dllName");
     ...
      PMyFunc=GetProcAddress(dllHandle,"ProcName")
      PMyFunc(....);
    ...
    不知可否解决你的问题!!!!
      

  12.   

    有一个牵强的办法,就是所有的dll的export的入口参数全部使用数组作为参数,如
    procedure MyFun1(args:array[] of pointer);
    procedure MyFun2(args:array[] of pointer);
    procedure MyFun3(args:array[] of pointer);
    每个函数的第一件事情是从数组中取出需要的数据.
    在调用dll的函数里,定义函数指针就比较容易
     type  PMyFun=procedure(args:array[] of pointer);
    ...
      dllHandle:=LoadLibrary("dllName");
     ...
      PMyFunc=GetProcAddress(dllHandle,"ProcName")
      PMyFunc(....);
    ...
    不知可否解决你的问题!!!!
      

  13.   

    我觉的要用加汇编的方法,先用loadlibrary & getprocaddress取地址,然后用汇编push 参数,
    然后call一下就好了
      

  14.   

    不会吧! cougar87(不死的海) ,大伯,照你的方法的话,如果参数个数有N个的话,不是DLL里面函数要写N 个了??
      

  15.   

    jgl1010(`king),不太明白你的意思,你可能没理解我的意思!
    之所以参数使用数组就是解决参数个数不定的问题,也是为了解决调用方式的通用化的问题。DLL里函数个数是由调用的需求决定的,和参数个数没有关系。
      

  16.   

    我认为比较合理的变通。不是,动态调用,而是,一个固定名称和参数的接口函数,这个函数的样式可以这样function callFunc(FunctionName:PChar;AragCount:DWORD;Arags:array of PChar;Result:DWORD);明白我的意思了吗?呵呵
      

  17.   

    loadlibrary 
    ttt:=getprocadresscall  tag
    tag :push 1   这要动态生成 可以在内存中申请空间把指令写进去,然后CALL首地址
         push 2    
         call ttt
         ret
    不过要注意函数的调用方式,平栈。
      

  18.   

    function callFunc(FunctionName:PChar;AragCount:DWORD;Arags:array of PChar;Result:DWORD);这个函数里面还不是要IF?那么可以这样:if FunctionName = 'Fun1' then
     Result := Fun1(arags[1], arags[2])
    else if ...
      

  19.   

    大虾在说话,虾米在听记。  :)呵呵,我怎么看都像是宏。能不能将要调用的过程写成字符数组,传入DLL。
    然后在DLL的入口处进行解释呢?
    我的意思跟BlueTrees(蜗牛) 相似。
      

  20.   

    是调用你自己写的一系列DLL,还是不定的通用DLL?
    如果是通用DLL的话,研究一下MS的RUNDLL32。EXE的方式,我想一般是用VARIANT类型的变量来达到效果吧。
    如果是你自己编的DLL的话,你可以采用类似插件编写的方式,定义一个通用的函数来作为入口函数,在这个函数中取回每个DLL的类型定义,然后再使用。
      

  21.   

    在MECROMEDIA AUTHORWARE中有个调用函数的功能,其方式是先要声明一个函数参数表(先输入),然后就可以在程序的任意位置调用了。
      

  22.   

    ^_^好像很多人都没理解楼主的意思。楼主等等吧,我自己的一个库DC可以解决这个问题,在运行时对某个函数信息未知的情况下可以调用它,而不管参数、参数类型、调用约定等问题。我想有时间写成一篇文章发到CSDN赚点稿费,发之前是不会公开代码的,现在才写了3页给你看个这个DC库的演示程序,执行后打开Script.dc文件(你可以修改里面的内容来添加其他DLL中的函数,这个不是脚本程序,只是封装了各种复杂操作来定义函数的),然后在Method Name里面输入函数名,Parameters后面输入参数,点Go就可以看到效果了,整个DC库有3000多行代码http://www.yixel.com/DC Demo.rar
      

  23.   

    我有个办法,不知道对不对,就是给DLL中的函数的参数加上默认值。如:
    function fun1(a: string = 'abc';b: integer = 123)
      

  24.   

    Eastunfail(浴血雏龙)==(恶鱼杀手),咱们交个朋友怎样?
      

  25.   

    delphi中可以直接调用C中写的不固定参数的函数,不过只有在静态连接是才管用你可以使用open array