请求思路,一个DELPHI程序要调用DLL,而DLL中的函数名,参数个数,参数类型为不定,要调用的DLL中的函数名、参数个数、参数类型要可以在窗口中Edit中动

P

porsche

Unregistered / Unconfirmed
GUEST, unregistred user!
请求思路,一个DELPHI程序要调用DLL,而DLL中的函数名,参数个数,参数类型为不定,要调用的DLL中的函数名、参数个数、参数类型要可以在窗口中Edit中动态输入 (100分)<br />请求思路,一个DELPHI程序要调用DLL,而DLL中的函数名,参数个数,参数类型为不定,<br>要调用的DLL中的函数名、参数个数、参数类型要可以在窗口中Edit中动态输入<br><br>我的意思就是函数不能在程序中事先定义,因为一切都是不固定的,要根据手工输入的<br>参数个数、参数类型来调用这个函数,有些函数是3个参数,有些函数是4个参数<br>手工输入如下:<br>函数名:abcd <br>参数1:a1 string型 &nbsp;<br>参数2:a2 integer型 <br>参数3:a3 boolean型<br>。。。。。<br>//参数个数:不定 参数类型:不定<br><br>要根据这些东西来调用这个函数<br><br>[red]再如:我的程序是先期开发的,我要在程序中留一个调函接口给其它用户,其他用户写好<br>DLL后,将函数名参数个数参数类型返回值类型(不是固定的) 保存在一个文本文件中,我<br>的程序通用读这个文本文件调用这个DLL中的函数[/red]<br><br><br>[blue]楼下的各位,我用过一个流程开发工具,调用的DLL就是普通的DLL,而并不是所谓的<br>array of const 之类的,因为这些被调用的DLL是我自己写的<br>请看截图 http://www.wansoft.com.cn/aaa.jpg &nbsp; [/blue]
 
好像這樣的動態庫是做不出來的。除非人為設一個很大的數組,要不就用Variants類型,但是dll支持不是很好。
 
同意楼上的做法~~~~~~~~Variant数组
 
“要调用DLL,而DLL中的函数名,参数个数,参数类型为不定,“<br>&nbsp; 只要主要参数对了 就可以 了 &nbsp;<br><br><br>
 
我的意思是 &nbsp;不是固定地调用哪个DLL中的哪个函数,<br>而是 如:<br>在Edit1中输入库路径,在EDIT2中输入函数名,在EDIT3输入函数参数,<br>参数个数、类型不是固定的<br>
 
我明白了,你是要輸入一個函數名,後面的都是參數,然後想得到相應的處理結果。那你可以用查找到那個名字,然後再調用就行了。比如:dllhandle:=loadlibrary(dll文件)(可以輸入的文本),procaddr:=getprocaddress(dllhandle,調用的函數)(也可自己的文本),然後procaddr(你的參數);
 
可以调用windows的rundll32.exe来加载dll中的函数,这个程序完全可以满足你。
 
TO 桦树皮,RUNDLL32 不能带变量参数的,<br>如 Winexec('rundll32 aaa.dll,abcd(a1,a2,a3)',SW_HIDE)怎么办?<br><br>TO springson, procaddr中的参数个数、参数类型也必须要在程序中事先type好啊!?!<br>我的意思就是函数不能在程序中定义,因为一切都是不固定的,要根据手工输入的<br>参数个数、参数类型来调用这个函数,有些函数是3个参数,有些函数是4个参数<br>手工输入如下:<br>函数名:abcd <br>参数个数:不定<br>参数1:a1 string型 &nbsp;<br>参数2:a2 integer型 <br>参数3:a3 boolean型<br>。。。。。<br>要根据这些东西来调用这个函数
 
帮你一把@
 
事先type好也行,不type也行,動態加載就可以了。然後在dll中多聲明一些函數,都是override的,這樣什麼參數都可以用。
 
思路:<br>&nbsp; 把要传入的实参值写到一个Buffer里, 调用你的DLL里的一个前期分析函数如<br>&nbsp; PreProcess, 它的参数就是要真正调用的函数的名称,一个Buffer和Buffer的大小.<br>&nbsp; 因为你要调用的具体函数是知道参数的具体结构的, 所以你可以在<br>&nbsp; PreProcess里写入如case (id) of<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; 这样的结构然后来分解参数,再传给具体的函数.
 
传递结构指针行吗
 
我接触dll不久,具我了解,dll是已经编译好的程序了,怎么能在已经编译好的程序里在做类型声明等的事情呢?即使有办法,也是不可取的!太浪费精神了!
 
关注,我每次写程序总是要多写好多与dll沟通的函数,相当麻烦与楼主一样,关注中
 
寫很多與dll溝通的函數是有好處的。動態判斷說不定哪天系統就奔潰了。
 
to springson,你说的办法是很好,但是<br>假如一个外部函数有10个参数,我是说假如,一般没这么多参数,共使用了 5种变量类型,<br>每种变量类型位置都不固定,那要要写多少句啊?
 
用函数重载就可以了,不需要判断<br>ex:<br>function abcd(a1:interger);overload;<br>function abcd(a1:string);overload;<br>function abcd(a1:boolean);overload;
 
UP者也有分
 
完全可以啊,你把库路径及文件名、函数、参数列表放到一个配置文件中,程序调用的时候去读这个配置就行了。其实关键就是参数列表的问题,类型和数量不确定。偶是用以下方法实现的:函数就不要参数,把参数放到配置文件中去,DLL直接去配置文件中取(因偶的只有两个类型int&amp;string相对简单)举个例子:<br>[Parameters]<br>P1=123+int //前面是值后面跟类型,折分转换即可<br>P2=Name+string<br><br>如果有很多数据类型就建个类型列表,一一对应转换<br>
 
顶部