L
liangexcel
Unregistered / Unconfirmed
GUEST, unregistred user!
请高手指点&lt;Delphi5编程人员指南&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&gt;0 then
begin
TfrmFive(FiveForm).ADOQuery.Close;//而不能直接写成frmFive.ADOQuery.Close;
end;
7.释放DLL后,主程序有时隐藏,D5开发人员指南中的例子也是一样,有什么办法可以解决?
8.释放DLL时,先释放窗体,再释放DLL时出错,但是加上信息对话框在两者之间就没有问题,怎么回事?
请原谅我的愚顿,请高手们狠狠的教我吧。
谢谢了.
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&gt;0 then
begin
TfrmFive(FiveForm).ADOQuery.Close;//而不能直接写成frmFive.ADOQuery.Close;
end;
7.释放DLL后,主程序有时隐藏,D5开发人员指南中的例子也是一样,有什么办法可以解决?
8.释放DLL时,先释放窗体,再释放DLL时出错,但是加上信息对话框在两者之间就没有问题,怎么回事?
请原谅我的愚顿,请高手们狠狠的教我吧。
谢谢了.