动态加载 “动态连接库” 的问题————————在线等待!!!!
大家好:
我写了一个动态连接库名字为:testdll.dll 。其中有一个输出过程的代码如下:
Procedure HelloDll(Myform:TForm);
begin
MessageBox(Myform.Handle,'Hello Dll','DLL Message Box',MB_OK);
end ;
我动态加载的代码如下:
Procedure TForm1.Button1Click(Sender:TObject);
type
ThelloDll=Procedure(Myform:TForm);
var
DLLInstance:THandle ;
PFunc :TFarProc ;
begin
DLLInstance := LoadLibrary('testdll.dll');
if DLLInstance = 0 then
begin
showmessage('can not load DLL');
exit ;
end;
PFunc := GetProcAddress(DLLInstance,'HelloDll');
if PFunc <> nil then
ThelloDll(PFunc)(form1)
else
showmessage('can not find the function');
FreeLibrary(DLLInstance);
end ;
我的问题是:为什么在程序中调用这个动态连接库的过程还要说明一个类来描述这个过程??????
ThelloDll=Procedure(Myform:TForm);ThelloDll这个类为什么要这样定义呢????
PFunc :TFarProc ; TFarProc 这个类型是什么意思?????
请各位前辈回答我这三个问题好吗?????????????????????????????????????????????????????????????????????????????????????????????????拜托了拜托!!
问题点数:50、回复次数:12Top
1 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2005-01-08 11:28:27 得分 0
ThelloDll=Procedure(Myform:TForm);ThelloDll;
定義函數指針...然後獲得你dll得導出函數得入口地址 函數地調用就是跳轉到函數地入口地址處而已
看上面跟你dll的函數的定義完全相同...要求必須這樣...
PFunc :TFarProc ; TFarProc 这个类型是什么意思?????
// 這個只是一個指針轉換而已 可以不用定義...
PFunc :TFarProc ;
->
PFunc: ThelloDll; 就可以了
ThelloDll(PFunc)(form1)
它這樣 還多轉換了一次 不必要了
唉 繁體打字麻煩 我知道可能還沒說清。。。啊啊啊啊
Top
2 楼zhangyanxxxx(张言)回复于 2005-01-08 12:08:04 得分 0
PFunc :TFarProc
PFunc := GetProcAddress(DLLInstance,'HelloDll');
是获取DLL中过程名为HelloDll的句柄
ThelloDll=Procedure(Myform:TForm);
是定义DLL中过程的对象Top
3 楼wangchuanbin(飘零)回复于 2005-01-10 10:39:23 得分 0
还有没有高手啊俺还不明白啊???Top
4 楼iriscat(猫小)回复于 2005-01-10 11:09:41 得分 0
GetProcAddress只是得到函数的地址以便于调用
但是参数如何传递,编译器需要知道函数原形,明白?Top
5 楼wangchuanbin(飘零)回复于 2005-01-10 11:57:14 得分 0
有没有高手啊!·!!能不能说到点子上啊 !!那几个API函数我都明白。为什么不回答我提出的那几个问题呢???我不提的问题请不要回答!!还有请不要答非所问!!答不了的请不要回答!!!!Top
6 楼nicotine(尼古丁)回复于 2005-01-10 17:42:24 得分 0
这几位老大说的不就是你问的么?有什么不明白的?哪里有答非所问?Top
7 楼wangchuanbin(飘零)回复于 2005-01-11 09:24:44 得分 0
大家好!我的问题上就提了三个问题啊请你们对号入座的给我回答好吗?不会的不要乱发言!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Top
8 楼kiboisme(蓝色光芒)(www.1284.net/)(软件开发机器人for delphi)回复于 2005-01-11 13:02:11 得分 0
为什么在程序中调用这个动态连接库的过程还要说明一个类来描述这个过程?
ThelloDll=Procedure(Myform:TForm);ThelloDll这个类为什么要这样定义呢????
第一:如果不定义参数和接口形式,怎么传递参数?Delphi怎么编译呀?
第二:这不是类定义,这是函数参数形式和接口定义。
PFunc :TFarProc ; TFarProc 这个类型是什么意思?????
这个确实没有必要
Top
9 楼kiboisme(蓝色光芒)(www.1284.net/)(软件开发机器人for delphi)回复于 2005-01-11 13:03:08 得分 0
TFarProc = Pointer;
这下应该明白了吧Top
10 楼zwjchina(蒲石)回复于 2005-01-11 13:09:08 得分 50
其实以上都说清楚了,只不过是你自己觉得不习惯而不愿意接受这种使用方法罢了!
我的问题是:为什么在程序中调用这个动态连接库的过程还要说明一个类来描述这个过程??????
那我反问你,不声明这个类型,你如何调用???
你应该也看到你写的代码了:
if PFunc <> nil then
ThelloDll(PFunc)(form1)
这里做了强制转换, 你不会告诉我你直接使用PFunc(form1)吧?如果不声明ThellDll,编译
^^^^^^^^^
Top
11 楼zwjchina(蒲石)回复于 2005-01-11 13:14:10 得分 0
器怎么知道PFun具体是个什么东西!?
PFunc :TFarProc ; TFarProc 这个类型是什么意思?????
是指针,你可以把它理解为Pointer的一个具体类型,如上面的高手们说的,可以不要这个TFarProc
直接PFunc:ThelloDll;
那么就可以这样了:
if PFunc <> nil then
PFunc(form1);
ThelloDll=Procedure(Myform:TForm);ThelloDll这个类为什么要这样定义呢????
原因是你的testdll.dll中是 Procedure HelloDll(Myform:TForm);
如果你的testdll.dll中是function HelloDll: boolean;
你还要把定义改成:
ThelloDll=function: boolean;
Top
12 楼wangchuanbin(飘零)回复于 2005-01-12 10:13:48 得分 0
谢谢各位高手谢谢了啊Top




