你在调用Dll时不能用静态装载,而只能用动态装载,才有可能被释放,即用loadlibrary函数来取得其Dll的句柄,然后用getprocaddress来得到所调用的函数的的位置指针,然后调用结束之后用freelibrary来释放即可: 示例: 声明过程 type ... tcalledprocedure=procedure(var s:pchar); var ........procedrue tform1.button1click(sender:tobject); var mylib:thandle; s:pchar; p:tcalledprocedure; begin mylib:=loadlibrary('Name.dll'); if mylib<>0 then begin @p:=getprocaddress(mylib,'funcname'); if@p<>nil then begin p(s); edit1.text:=string(s); end; freelibrary(mylib); end; end; 该程序从name.dll中调用函数funcname来取得一个字符串,并将其显示在edit1中,你可以试一下,不行了再通知我,OK?
在DllMain中的 case DLL_PROCESS_ATTACH:中分配资源。 case DLL_PROCESS_DETACH:中释放。
示例:
声明过程
type
...
tcalledprocedure=procedure(var s:pchar);
var
........procedrue tform1.button1click(sender:tobject);
var
mylib:thandle;
s:pchar;
p:tcalledprocedure;
begin
mylib:=loadlibrary('Name.dll');
if mylib<>0 then
begin
@p:=getprocaddress(mylib,'funcname');
if@p<>nil then
begin
p(s);
edit1.text:=string(s);
end;
freelibrary(mylib);
end;
end;
该程序从name.dll中调用函数funcname来取得一个字符串,并将其显示在edit1中,你可以试一下,不行了再通知我,OK?
case DLL_PROCESS_ATTACH:中分配资源。
case DLL_PROCESS_DETACH:中释放。