请求思路,一个DELPHI程序要调用DLL,而DLL中的函数名,参数个数,参数类型为不定,要调用的DLL中的函数名、参数个数、参数类型要可以在窗口中Edit中动态输入我的意思就是函数不能在程序中事先定义,因为一切都是不固定的,要根据手工输入的
参数个数、参数类型来调用这个函数,有些函数是3个参数,有些函数是4个参数
手工输入如下:
函数名:abcd
参数1:a1 string型
参数2:a2 integer型
参数3:a3 boolean型
。。
//参数个数:不定 参数类型:不定要根据这些东西来调用这个函数
参数个数、参数类型来调用这个函数,有些函数是3个参数,有些函数是4个参数
手工输入如下:
函数名:abcd
参数1:a1 string型
参数2:a2 integer型
参数3:a3 boolean型
。。
//参数个数:不定 参数类型:不定要根据这些东西来调用这个函数
我看你不是调用dll的问题,
而是你建dll的问题
楼主大概想这样:
(出于测试一个dll的原因)一个一个的调用dll的函数,dll中的函数是知道的,但是出于某些原因,我们想手动调用这些函数(而不是loop结构自动调用).
显式装入dll的过程正如meshwork(白开水)同志所说,使用LoadLibrary和GetProcAddress因为其中的参数是pchar,那么我们可以通过某种方法来完成上述的要求
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(....);
...
不知可否解决你的问题!!!!
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(....);
...
不知可否解决你的问题!!!!
然后call一下就好了
之所以参数使用数组就是解决参数个数不定的问题,也是为了解决调用方式的通用化的问题。DLL里函数个数是由调用的需求决定的,和参数个数没有关系。
ttt:=getprocadresscall tag
tag :push 1 这要动态生成 可以在内存中申请空间把指令写进去,然后CALL首地址
push 2
call ttt
ret
不过要注意函数的调用方式,平栈。
Result := Fun1(arags[1], arags[2])
else if ...
然后在DLL的入口处进行解释呢?
我的意思跟BlueTrees(蜗牛) 相似。
如果是通用DLL的话,研究一下MS的RUNDLL32。EXE的方式,我想一般是用VARIANT类型的变量来达到效果吧。
如果是你自己编的DLL的话,你可以采用类似插件编写的方式,定义一个通用的函数来作为入口函数,在这个函数中取回每个DLL的类型定义,然后再使用。
function fun1(a: string = 'abc';b: integer = 123)