为什么我从dll中调出的模式窗体在任务栏上显示呢?
为什么我从dll中调出的模式窗体在任务栏上显示呢?怎样像一个真正的dll被主程序调用而不在任务栏上出现一个线程? 问题点数:100、回复次数:17Top
1 楼lws0472(期待2008)回复于 2002-11-11 16:45:08 得分 0
因为你在dll中做函数时没有把调用程序的句柄传进去。
在程序中加参数 Ahandle : Thandle
函数中加Application.handle := Ahandle;
在别的程序中调用函数时把程序的句柄传进去Top
2 楼lixuebin2002(彬彬)回复于 2002-11-11 17:06:17 得分 0
这两个东西加在哪?Top
3 楼lws0472(期待2008)回复于 2002-11-11 17:12:06 得分 0
加在你dll的函数中,就是你dll的原程序中,你在dll的函数中是通过函数来动态创建的窗体,就是那个函数。
如果dll不是你做的,那只能找dll的开发人了
我要回家玩三国群侠传了,有问题明天解答Top
4 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-11-11 17:14:37 得分 0
SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) and (not WS_EX_APPWINDOW) or WS_EX_TOOLWINDOW);
Top
5 楼lixuebin2002(彬彬)回复于 2002-11-11 17:17:37 得分 0
我说飞仙,dll也是我写的,我不知把这两个东西放在哪?
我把Ahandle : Thandle放入了窗体的var中,
把Application.handle := Ahandle放入了我的返回函数中,也就是被exe调用的函数! 这样不行,错在哪?Top
6 楼Impylm(韩冰)回复于 2002-11-11 17:18:35 得分 0
一般放在DLL中导出函数里Top
7 楼lixuebin2002(彬彬)回复于 2002-11-11 17:32:06 得分 0
我说兄弟们,能不能说的详细一点呀,我很急呀!
exe那边写什么?dll那边写什么?Top
8 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-11-11 17:41:53 得分 0
EXE不用写,只需要调用就行了,在DLL的窗口创建过程中加入:
SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) and (not WS_EX_APPWINDOW) or WS_EX_TOOLWINDOW);
Top
9 楼78(2008奥运痴狂症)回复于 2002-11-11 17:46:33 得分 0
DLL在中这样写:
library myDll;
uses
SysUtils,
Classes;
{$R *.res}
var
SaveDLLApp:TApplication;
procedure myProc(MainApp:TApplication;)export; stdcall;
var
Child:TfrmRy; //YourFrom
begin
if not Assigned(SaveDllApp) then
begin
SaveDllApp:=Application;
Application:=MainApp;
end;
Child:=TfrmRy.Create(Application);
try
Child.ShowModal;
finally
Child.Free();
end;
procedure MyLibraryProc(Reason:integer);
begin
if Reason=DLL_PROCESS_DETACH then
begin
if Assigned(SaveDllApp) then
Application:=SaveDllApp;
end;
end;
Exports
myProc;
begin
DLLProc := @MyLibraryProc;
end;
在调用的EXE文件中:
unit unit1;
interface
uses ....
type
Tmyproc=procedure(mainApp;TApplication);stdcall;
tform1=class(Form1)
...
procedure TForm1.button1onClick(Sender:Tobject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: TShowMe;
begin
DllHandle := LoadLibrary(PChar( myDll));
ProcAddr := GetProcAddress(DllHandle, 'myProc');
try
if ProcAddr <> nil then
begin
ProvaChild:=ProcAddr;
ProvaChild(Application);
end;
Except
FreeLibrary(Dllhandle);
MessageBox(Application.Handle,PChar(DllName+'文件接口错误'),'错误',
MB_ICONWARNING+MB_OK);
End;
FreeLibrary(Dllhandle);
end;Top
10 楼yang6130(柳轻风)回复于 2002-11-11 17:53:50 得分 0
模式窗体在任务栏上显示是因为EXSTYLE中含有WS_EX_APPWINDOW,
xzhifei(飞) 的方法应该是可行的,你为什么不试一下?Top
11 楼lws0472(期待2008)回复于 2002-11-12 08:26:47 得分 0
我又回来了,昨天晚上玩三国群英传玩到12点,累死了。
先解释一下:
DLL也是一个应用程序,他也有Application,而调用DLL的应用程序也有Application,如果你不把两个Application通一的话,在任务栏上就会出现两个。
下面是一个在DLL用于动态创建窗口的范例,此函数也就是你的引出函数。
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
Function Thistest(Ahandle : Thandle):bool;stdcall;
implementation
{$R *.dfm}
Function Thistest(Ahandle : Thandle):bool;
var
Form1: TForm1;
begin
Application.Handle := Ahandle;
Form1 := Tform1.Create(application);
try
Form1.ShowModal;
result := true;
finally
Form1.Free;
end;
end;
end.
调用时把程序的句柄传进去,如Thistest(Form1.handle):Top
12 楼lixuebin2002(彬彬)回复于 2002-11-12 09:55:24 得分 0
兄弟们,不知道是不是我笨,还是没有成功,因为我这个dll中有很多窗体,所以我在dll的返回函数中让第一个窗体create并且showmodal,其它的窗体在相应的事件中create。对了,我返回的函数是boolean型的,有没有关系?“天外飞仙”的程序的“thistest(formx.handle)”我放到了返回函数中,结果出现异常,各位帮帮兄弟吧!Top
13 楼lws0472(期待2008)回复于 2002-11-12 10:38:01 得分 0
怎么会有问题呢,这是我刚做的,并且测试通过。
我也做过在DLL里放n个FORM,只要动态创建就行了,没有问题的。你的程序有没有保密的地方,没有的话把程序贴出来吧Top
14 楼lixuebin2002(彬彬)回复于 2002-11-12 11:29:58 得分 0
dll部分:
library landchange;
uses
SysUtils,
Classes,
forms,
frmfirsttz in 'frmfirsttz.pas' {firsttz},
............;
exports
change name 'change';
{$R *.res}
begin
end.
dll中一个窗体的内容:
unit frmfirsttz;
interface
uses ...........;
type
Tfirsttz = class(TForm);
......;
private
{ Private declarations }
public
{ Public declarations }
end;
var
firsttz: Tfirsttz;
function change: Boolean;export;
implementation
uses ....
....;
{$R *.dfm}
function change;export;
begin
firsttz:=tfirsttz.Create(Application);
firsttz.ShowModal;
firsttz.Free;
end;
exe部分:
unit Unit1;
interface
uses
..........;
type
TForm1 = class(TForm)
.......;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function nowchange: Boolean;
external 'landchange.dll' name 'change';
我只在某一事件中写了一句“change;”,不知把你的程序放在哪?Top
15 楼78(2008奥运痴狂症)回复于 2002-11-12 12:33:10 得分 0
直接传Application比较好.在DLL中可以控制EXE文件的一些内容.
Top
16 楼lws0472(期待2008)回复于 2002-11-12 12:40:58 得分 100
dll部分:
library landchange;
uses
SysUtils,
Classes,
forms,
frmfirsttz in 'frmfirsttz.pas' {firsttz},
............;
exports
change ; //这里没必要写name
{$R *.res}
begin
end.
dll中一个窗体的内容:
unit frmfirsttz;
interface
uses ...........;
type
Tfirsttz = class(TForm);
......;
private
{ Private declarations }
public
{ Public declarations }
end;
var
firsttz: Tfirsttz;
function change(Ahandle : Thandle): Boolean;stdcall; //这里修改
implementation
uses ....
....;
{$R *.dfm}
function change(Ahandle : Thandle): Boolean; //这里修改
var //这里修改
myfirsttz : Tfirsttz;
begin
Application.handle := Ahandle; //这里修改
firsttz:=tfirsttz.Create(Application);
try //这里修改
firsttz.ShowModal;
result := true;
finally
firsttz.Free;
end;
end;
exe部分:
unit Unit1;
interface
uses
..........;
type
TForm1 = class(TForm)
.......;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function change(Ahandle : Thandle): Boolean;stdcall;external 'landchange.dll'; 这里修改
//在这里调用
change(Form1.handle);
Top
17 楼lixuebin2002(彬彬)回复于 2002-11-12 13:05:08 得分 0
“仙”谢谢你,我给你给分了!Top




