急救!关于Dll方面的疑问:装载了dll后,直接关闭主程序会报错...

默默唐 2006-06-27 11:36:22
主程序分别调用stock.dll、sell.dll,非模式状态显式,指定了他们的父窗体Parent为主程序中的一个Panel,(在模式状态下显式不能指定dll的父窗体,不知道什么原因...)

现在有几个问题请教各位:
1、点击菜单调用了stock.dll,不进行任何操作,直接关闭主程序,主程序窗体是不见了,但实际上程序没有关闭,在进程中仍可以看到!必须按Ctrl+F2强行退出调试状态才结束!
但是点击stock.dll窗体里面的close按钮后,dll关闭了,主程序也正常关闭了.现在的问题也就是直接关闭主程序,已调用的dll没有自动释放?

2、看到资料是说一般显式调用dll的非模式窗体必须有配套的两个过程或函数,一个调用、显示窗体,另外一个用于释放窗体,对于释放窗体的这个过程或者函数不晓得在主程序中应该怎么调用?在什么时候调用呢?

下面是部分代码:
stock.dll内容:
function ShowDllForm(AHandle: THandle):Boolean;
var DllForm:Tcggl_main_f;
begin
Result := True;
try
CoInitialize(nil);
if cggl_main_f=nil then
begin
DllForm := Tcggl_main_f.Create(Application);
try
DllForm.ParentWindow:=AHandle;
dm:=Tdm.Create(Application);//创建dm
DllForm.Show;
except
on e:exception do
begin
cggl_main_f.Free;
dm.Free;
end;
end;
end;
except
Result:=False;
end;
end;

function FreeDLLForm(AHandle:THandle):Boolean;//【这段释放的不知道该怎么写,请教各位帮忙写下 ^_^ 】
begin
Application.Handle:=AHandle;
//dm中用到SocketConnection的要先于dll主窗体之前关闭~~
if dm.SocketConnection1.Connected then dm.SocketConnection1.Connected:=False;
if cggl_main_f.Showing then cggl_main_f.Close;
if not cggl_main_f.Showing then
begin
cggl_main_f.Free;
Result:=True;
end else Result:=False;end;

主程序中:
Type
TShowDllForm = Function(AHandle:THandle):boolean;stdcall;
TFreedllForm = Function(AHandle:THandle):boolean;stdcall;

var
main_f: Tmain_f;
HandleCall:THandle;//stock.dll窗口句柄

procedure Tmain_f.MyEXImage9Click(Sender: TObject);
var
ShowDllForm: TShowDllForm;
begin
try
if HandleCall=0 then
begin
HandleCall:=LoadLibrary('stock.dll');
if HandleCall=0 then
begin
Messagebox(Handle,'没有找到附带DLL文件,请确认程序是否完整!','加载DLL失败',MB_OK+MB_ICONEXCLAMATION);
Exit;
end ;
@ShowDllForm:=GetProcAddress(HandleCall,'ShowDllForm') ;
if @ShowDllForm<>nil then
try
ShowDllForm(RzPanel10.Handle);
except
raise Exception.Create('加载DLL失败');
end;
end;
finally
FreeLibrary(RzPanel10.Handle);
end;
end;

procedure Tmain_f.FormDestroy(Sender: TObject);
begin
if HandleCall<>0 then
begin
FreeLibrary(HandleCall);
HandleCall:=0;
end;
end;

不知道FreeDllForm在主程序中何时调用?该怎么样调用?

以上描述的如不清楚随时跟贴说明~~~~

麻烦大家了!~
...全文
254 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dlwxn 2006-06-29
  • 打赏
  • 举报
回复
原因是你在dll中显示窗体用的是show。

而在动态调用dll的时候,FreeLibrary(RzPanel10.Handle);
//没有看明白怎么释放这个 RzPanel10.Handle?

应该是FreeLibrary(HandleCall),但是这个时候窗体没有关闭,dll的窗体将会一闪就会关闭。
解决方法可以是在关闭dll的窗体的时候,给主程序窗体发生一个自定义的消息,主程序监视到这个消息,才把dll的句柄释放。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧