DLL卸载的问题(100分)

  • 主题发起人 主题发起人 zzhdi
  • 开始时间 开始时间
Z

zzhdi

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在Dll卸载时处理一些事情,我用AddExitproc、Exitproc、DLLproc等方法都尝试了,
结果都不行,AddExitproc加入的过程,Exitproc过程,Dllproc函数都没有被调用,why?
 
试试在如下部分做卸载处理.
finalization
ExitProc不适应于DLL,AddExitProc已经不再适合新版本DELPHI.
 
我在Dll中创建了一个Data Module,这个dm必须在dll卸载时释放。你说的方法我试过不行
 
这样:
主要是DLLProc
例子:
procedure LibraryProc(Reason: Integer); //注意下面还要设置DllProc的
begin
//注意Reason的值:
// DLL_PROCESS_DETACH = 0;
// DLL_PROCESS_ATTACH = 1;
// DLL_THREAD_ATTACH = 2;
// DLL_THREAD_DETACH = 3;
//注意 DLL_PROCESS_ATTACH 是不会被自动调用的,初始化还是要写在下面
// 其它三个,包括释放,是有用的
end;

begin
DLLProc:=@LibraryProc; //这个一个要写!!!!
//初始化代码这里写
//当然,你也可以这里调用一下 LibraryProc(DLL_PROCESS_ATTACH ),这样上面的函数功能就全了
end.
 
上铺的兄弟:
我曾经也这样写过,但我在调试时,在Libraryproc 中设置了断点,并没有发现被调用
。可我翻了许多资料,资料上说的和你的一样,这是怎么回事?
 
反正我是用了,有效。
断点不一定奏效,
如果你的是 nt/2000 ,可以用 windows.beep(1000,1000) 测试,能听到pc喇叭发声
如果是95/98,beep并不是pc喇叭发声,而是相当于messagebeep,而且不可控制频率和时间,
那么在95/98你可以通过读写文件来记录是否发生
因为处于系统的清除状态,你也不能用messagebox来测试,因为还没显示,进程就已经完了,你是看不到的
 
Dll中的Data Module,在dll卸载时应该在:
finally
freelibrary(handle);
释放后也随之同时释放呀!!
 
我的Dll是这样的:
library server;
uses
SysUtils,
Classes,windows,
Unit1 in 'Unit1.pas' {Form1};
procedure Test;
begin
form1:=Tform1.create(nil);
end;

{$R *.res}
exports
Test;
begin
end.
这个form1需要在dll卸载时销毁。
如果我在unit1 的最后加入:
initialization
finalization
if assigned(form1) then FreeAndnil(form1);
dll 卸载时出错。
按照Pipi.兄弟所说的去做,我确实没有听到pc喇叭声。
 
按照Pipi.兄弟所说我也这样做了:
library Project1;
uses
SysUtils,
Classes,windows,
Unit1 in 'Unit1.pas' {Form1};
procedure Test;
begin
form1:=Tform1.Create(nil);
form1.ShowModal;
end;

exports
Test;

{$R *.res}

procedure mydllproc(rs:integer) ;
var
f:Tstringlist;
begin
//windows.beep(1000,1000);
if rs=DLL_PROCESS_DETACH then
begin
f:=Tstringlist.Create;
f.Add('asdfafasdf');
f.SaveToFile('c:/test.txt');
f.Free;
end;
end;
begin
Dllproc:=@mydllproc;
end.
我没有发现 c:/test.txt 文件
 
我试了,win2000/delphi5,怎么试都有用
你确定dll装入了吗,比如,你可以在 begin ... end. 加入一些东西确定一下dll确实装入了
 
DLL确实载入了。我用的是 英文版Win2000/Delphi6
 
谢谢大家的帮助,问题已经解决,原因是我没有安装Delphi6 的补丁。Pipi.兄弟的帖子是
正确的,我往上贴的两段代码也是正确的。
 
后退
顶部