请高手指点<Delphi5编程人员指南>第九章动态连接库例子.(谢谢前面问题帮忙的朋友,请再看看6.7.9问题)(都快一个星期了,高

  • 主题发起人 主题发起人 liangexcel
  • 开始时间 开始时间
L

liangexcel

Unregistered / Unconfirmed
GUEST, unregistred user!
请高手指点&amp;lt;Delphi5编程人员指南&amp;gt;第九章动态连接库例子.(谢谢前面问题帮忙的朋友,请再看看6.7.9问题)(都快一个星期了,高人快点来帮帮忙吧.) ( 积分: 50 )<br />function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
var
DLLForm: TDllForm;
begin
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application);
try
DLLForm.Caption := ACaption;
DLLForm.ShowModal;
Result := DLLForm.calDLLCalendar.CalendarDate; // Pass the date back in Result
finally
DLLForm.Free;
end;
end;

procedure TMainForm.btnGetCalendarClick(Sender: TObject);
var
LibHandle : THandle;
ShowCalendar: TShowCalendar;
begin
LibHandle := LoadLibrary('CALENDARLIB.DLL');
try
if LibHandle = 0 then
raise EDLLLoadError.Create('Unable to Load DLL');
@ShowCalendar := GetProcAddress(LibHandle, 'ShowCalendar');
if not (@ShowCalendar = nil) then
lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
else
RaiseLastWin32Error;
finally
FreeLibrary(LibHandle); // Unload the DLL.
end;
end;
这是D5编程人员指南里第九章动态连接库里的例子,我想不太明白。请高手指点一下
1。function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
这一句中,AHandle和ACaption是不是自已定义的名字?就是我只用A或B来表示都行?THandle和String是指类型,函数运行要提供的参数,这个我应该没有错吧?但下面我有一点不明,请往下看。
2。Application.Handle := AHandle;
DLLForm.Caption := ACaption;
这两句我想只是和其他方法一样的赋值,是不是?
3。LibHandle : THandle;
LibHandle := LoadLibrary('CALENDARLIB.DLL');
这一句将LibHandle定义为句柄,是指CALENDARLIB.DLL的句柄?
4。再往下的,就是调动连接库的了,但是我没有看到一句是为AHandle和ACaption赋值的,我不明白,
AHandle是怎么取得主程序的句柄,ACaption是怎么取得主程序的Caption的,在上面的例子中,是哪一句的关系?
5。在非模式窗体例子中,
function ShowCalendar(AHandle: THandle; ACaption: String): Longint;
begin
.....
Result:=Longint(DLLForm)
....
end
Longint不是一个长整型吗?Result:=Longint(DLLForm)是什么的意思呀?因为相对来说Int(DLLForm)我实在想不明白是什么意思。
6.var
DLLForm: TDllForm;
这个声明是在函数的内部,而不是在interface部分,是必要的吗?有什么作用?我发觉每一个如果要在外部调用的过程,都要写成这样
procedure FiveSQL(FiveForm:LongInt;TypeID,ACaption:String;OutNum:Integer);
var
frmFive:TfrmFive;
begin
if FiveForm&amp;gt;0 then
begin
TfrmFive(FiveForm).ADOQuery.Close;//而不能直接写成frmFive.ADOQuery.Close;
end;
7.释放DLL后,主程序有时隐藏,D5开发人员指南中的例子也是一样,有什么办法可以解决?
8.释放DLL时,先释放窗体,再释放DLL时出错,但是加上信息对话框在两者之间就没有问题,怎么回事?
请原谅我的愚顿,请高手们狠狠的教我吧。
谢谢了.
 
function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
var
DLLForm: TDllForm;
begin
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application);
try
DLLForm.Caption := ACaption;
DLLForm.ShowModal;
Result := DLLForm.calDLLCalendar.CalendarDate; // Pass the date back in Result
finally
DLLForm.Free;
end;
end;

procedure TMainForm.btnGetCalendarClick(Sender: TObject);
var
LibHandle : THandle;
ShowCalendar: TShowCalendar;
begin
LibHandle := LoadLibrary('CALENDARLIB.DLL');
try
if LibHandle = 0 then
raise EDLLLoadError.Create('Unable to Load DLL');
@ShowCalendar := GetProcAddress(LibHandle, 'ShowCalendar');
if not (@ShowCalendar = nil) then
lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
else
RaiseLastWin32Error;
finally
FreeLibrary(LibHandle); // Unload the DLL.
end;
end;
这是D5编程人员指南里第九章动态连接库里的例子,我想不太明白。请高手指点一下
1。function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
这一句中,AHandle和ACaption是不是自已定义的名字?就是我只用A或B来表示都行?THandle和String是指类型,函数运行要提供的参数,这个我应该没有错吧?但下面我有一点不明,请往下看。
2。Application.Handle := AHandle;
DLLForm.Caption := ACaption;
这两句我想只是和其他方法一样的赋值,是不是?
3。LibHandle : THandle;
LibHandle := LoadLibrary('CALENDARLIB.DLL');
这一句将LibHandle定义为句柄,是指CALENDARLIB.DLL的句柄?
4。再往下的,就是调动连接库的了,但是我没有看到一句是为AHandle和ACaption赋值的,我不明白,
AHandle是怎么取得主程序的句柄,ACaption是怎么取得主程序的Caption的,在上面的例子中,是哪一句的关系?
5。在非模式窗体例子中,
function ShowCalendar(AHandle: THandle; ACaption: String): Longint;
begin
.....
Result:=Longint(DLLForm)
....
end
Longint不是一个长整型吗?Result:=Longint(DLLForm)是什么的意思呀?因为相对来说Int(DLLForm)我实在想不明白是什么意思。
6.var
DLLForm: TDllForm;
这个声明是在函数的内部,而不是在interface部分,是必要的吗?有什么作用?我发觉每一个如果要在外部调用的过程,都要写成这样
procedure FiveSQL(FiveForm:LongInt;TypeID,ACaption:String;OutNum:Integer);
var
frmFive:TfrmFive;
begin
if FiveForm&amp;gt;0 then
begin
TfrmFive(FiveForm).ADOQuery.Close;//而不能直接写成frmFive.ADOQuery.Close;
end;
7.释放DLL后,主程序有时隐藏,D5开发人员指南中的例子也是一样,有什么办法可以解决?
8.释放DLL时,先释放窗体,再释放DLL时出错,但是加上信息对话框在两者之间就没有问题,怎么回事?
请原谅我的愚顿,请高手们狠狠的教我吧。
谢谢了.
 
1. 正确AHandle 是自己定義的變量, 容易辨认是THandle 类型, 加A 前缀是变量命名的一个规范, 与函数体内用到的Handle 相区别。
2. 正确, 第一句设置窗口句柄为工程主控, 第二句就跟简单的窗口设置Caption 是一样的。
3. 我的理解是这样的。
4. 就是这一句喽:
if not (@ShowCalendar = nil) then
lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
找到ShowCalendar 这个函数就调用, 两个参数很明显啊。
5. 我理解的不够深刻, 不敢多说。
 
请楼主看这一句:
if not (@ShowCalendar = nil) then
lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
else
RaiseLastWin32Error;
函数showcalendar(application.handle,caption)中的两个参数的意义就是:
application.handle:应用程序的句柄,application是delphi内建的
caption:讲的全一点就是:self.caption self可以省略,当然self在这里指的是主窗体
 
2.问题:
在DLL中有自己的Appliction,为了和主程序共用一个Appliction,所以需要 Application.Handle := AHandle;,好像跟资源分配有关系,具体还是请其他高手解释一下我对这个概念也很模糊。
3:问题:
装载DLL时候,会得到Dll句柄,通过这个句柄,可以调用Dll中的函数。
4:问题:
TShowCalendar应该是一个函数类型定义,通过GetProcAddress函数取得Dll中函数ShowCalendar的调用地址,ShowCalendar := 函数调用地址
lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, Caption));
上面这句代码就是,调用了DLL中的ShowCalendar函数,参数1:执行程序句柄,参数2:主窗口标题。

5:问题:
Result:=Longint(DLLForm)其实就是将DLLForm的地址返回,在Delphi中对象其实就是指针类型。表达能力不够好,不懂其他高手再解释一下。
 
是delphi中数据类型的问题.楼主可去看vcl的定义,thandle是怎么定义的.
其实delphi中很多数据类型本身就是longint,只是为了程序容易读,而声明成别的类型的
方法(ctrl+鼠标)
 
1、function ShowCalendar([brown]AHandle[/brown]: THandle; [brown]ACaption[/brown]: String): TDateTime;
var
DLLForm: TDllForm;
begin
Application.Handle :=[red] AHandle[/red];为本函数收到的参数。
DLLForm := TDLLForm.Create(Application);
try
DLLForm.Caption := [red]ACaption[/red];为本函数收到的参数。
DLLForm.ShowModal;
Result := DLLForm.calDLLCalendar.CalendarDate; // Pass the date back in Result
finally
DLLForm.Free;
end;
end;
2、理解正确
3、理解正确
4、二个均为函数参数,在调用时得到
5、THandle与Longint类型是一致的,这个在windows中有规定。在类型强制识别时
THandle可以转换为Longint
6、var DLLForm: TDllForm;在何处均可,只看作用域范围
7、只有在DLLForm安全释放后再释放DLL,就不会出现上述问题。
8、这个问题跟上面一样。
 
怎么判断已经安全释放DLLForm?
 
try

finally
dllform.free;
end;
这种结构dllform还不安全释放?那borland的产品还有人用吗?????
dllform是肯定安全释放的
 
多人接受答案了。
 
后退
顶部