当前位置:主页>仓库管理软件> 列表

无法关闭DLL创建的窗体 找免费进销存

库存管理软件版1楼: 我用DLL创建了一个窗体,当窗体隐藏在显示后,却无法关闭。

主程序:
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateForm;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
hWND: Cardinal;
begin
hWND:= FindWindow(nil, ''aaa'');
if hWND = 0 then exit;
SendMessage(hWND, WM_Close, 0, 0);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
hWND: Cardinal;
begin
//ShowForm; //如果用这种方式,则可以正常显示
//exit;
hWND:= FindWindow(nil, ''aaa'');
if hWND = 0 then exit;
Memo1.Clear;
ShowWindow(hWND, SW_SHOWNORMAL);
end;

DLL部分
procedure CreateForm(AppHandle: Cardinal); stdcall;
begin
Form2:= TForm2.Create(nil);
try
Form2.Show;
finally
end;
end;

procedure ShowForm; stdcall;
begin
Form2.Show;
end;

窗口建立后,第一次我可以关闭窗体。我并不想释放这个窗体,但再次显示出来后,就无法关闭。是什么原因?
虽然可以直接用注释部分显示,并且可以顺利关闭。但为什么不能用 ShowWindow方式。我看别人创建的DLL窗体,都可以使用外部程序进行显示和关闭。

分不多,请大家释疑!感谢

2楼: 可以用ShowWindow方式打開窗體的。
QQ:136293586 如免费进销存

3楼: 隐藏窗体是WM_HIDE,你的已经关闭了.
你说的可以正常显示,当你调用SHOW函数时,由于你的DLL是静态载入的,所以首先进行类初始化,当然可以.

4楼: to bbscom:
能不能详细点呢?谢谢

to dancekids:
你说窗口已经关闭了?不会吧,那为什么FindWindow能找到呢?调用Show的时候,也并没有在创建窗口。

5楼: 问题解决了,但想问一下

例如在dll中,建立窗口时

....
Application.Handle:= AppHandle;//主程序的Application
Form1:= TForm1.Create(AppHandle);

那么,如果利用dll注入到其他外部程序,怎么才能获得其他程序的 Application.Handle ?

6楼: to dwxm:
能否把你的代码贴出来,或发给我?
email:towady@gmail.com
谢谢