以下是《Delphi5 开发人员指南》书中第9章DLL的例子(246页):
//DLL文件:
library DLLEntryLib;
uses
SysUtils,windows,dialogs,classes;
procedure DLLEntryPoint(dwReason:DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:ShowMessage('Attaching to Dll');
DLL_PROCESS_DETACH:ShowMessage('Detaching from process');
DLL_THREAD_ATTACH:messagebeep(0);
DLL_THREAD_DETACH:messagebeep(0);
end;
end;
begin
DllProc:=@dllEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
////////////////////////////////////////
//装载DLL
procedure TForm1.btnLoadLibClick(Sender: TObject);
begin
if LibHandle=0 then
begin
LibHandle:=LoadLibrary('DllEntryLib.dll');
if LibHandle=0 then
raise Exception.Create('Unable to load DLL');
end
else
ShowMessage('Library already loaded');
end;
//卸载DLL
procedure TForm1.btnFreeLibClick(Sender: TObject);
begin
if not (LibHandle=0) then
begin
FreeLibrary(LibHandle);
LibHandle:=0;
end;
end;加载DLL一切正常,当单击btnFreeLib按钮卸载DLL时应该弹出'Detaching from process'的消息框,但实际并没有弹出,为什么?
书中测试程序还创建了子线程,但子线程创建和结束时DLL也没有发出声音,为什么?
(Delphi 6.0 Win2K中文版)
//DLL文件:
library DLLEntryLib;
uses
SysUtils,windows,dialogs,classes;
procedure DLLEntryPoint(dwReason:DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:ShowMessage('Attaching to Dll');
DLL_PROCESS_DETACH:ShowMessage('Detaching from process');
DLL_THREAD_ATTACH:messagebeep(0);
DLL_THREAD_DETACH:messagebeep(0);
end;
end;
begin
DllProc:=@dllEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
////////////////////////////////////////
//装载DLL
procedure TForm1.btnLoadLibClick(Sender: TObject);
begin
if LibHandle=0 then
begin
LibHandle:=LoadLibrary('DllEntryLib.dll');
if LibHandle=0 then
raise Exception.Create('Unable to load DLL');
end
else
ShowMessage('Library already loaded');
end;
//卸载DLL
procedure TForm1.btnFreeLibClick(Sender: TObject);
begin
if not (LibHandle=0) then
begin
FreeLibrary(LibHandle);
LibHandle:=0;
end;
end;加载DLL一切正常,当单击btnFreeLib按钮卸载DLL时应该弹出'Detaching from process'的消息框,但实际并没有弹出,为什么?
书中测试程序还创建了子线程,但子线程创建和结束时DLL也没有发出声音,为什么?
(Delphi 6.0 Win2K中文版)
解决方案 »
- JR们都进来,帮帮我 嘿嘿~~
- 關於使用 SQLDMO_TLB(sqldmo.dll) 列舉局域網內SQLServer的問題。
- fastReport注册的问题。打印的页面提示:fastReport - unregistered
- 散分!
- TOOLBAR问题
- Dephi中怎么设置可以把编译后的文件输入到自定义的路径呢?(如exe.dll 文件等)
- 用ApplicationEvents如何捕获程序异常?
- 利用DBGrid做数据录入,又不要显示表中的原有数据,如何实现?
- BDE密码写在那里,用QUERY直接连接的
- 关于delphi中MDI????
- 请问在SQL Server数据库中的表是否一定要设主键,是否一定要设索引,主键和索引的关系如何。
- Kingron(单身走我路……) 和 firetoucher(风焱) ( ) 在吗?
又浪费了20分.....
楼主.我想这应该是DELPHI版本的操作系统的问题.我和你用的版本完全相同.
同一个DLL项目文件编译出来,要比98下小10K,不知道为什么.
哪位高人指点一下.
我完全按照书上的程序写的,没有改动。
我想可能是版本问题,谁用其他版本的Delphi,能帮忙编译一下吗?
我的解决方法是自己写个函数来释放dll中引用的资源!
你用的是什么版本?
我在 BCB 5.0 使用的非常正常呀-----------------------------------
什么时候有时间、有朋友一起去踢球呢?
DLLProc := @dllEntryPoint;
DLLProc(DLL_PROCESS_ATTACH);
DLLProc(DLL_PROCESS_DETACH);
end.
我看过有几个解决方法,有一个是修改system.pas的代码,修正其中的bug,过程比较麻烦,涉及到汇编的知识.
而我,在我的项目中,采取了一个折衷的办法,也许不是很好.就是,主程序在调用FreeLibrary前,先调用一个自定义的FreeDll,其实,也可调用DLLEntryPoint(DLL_PROCESS_DETACH);手动释放占用的系统资源