关于DLL窗体中的API函数问题!!

国风 2004-06-28 11:13:37
怎样判断一个DLL窗体已关闭?
我用fsMDIForm窗体方式.每个DLL窗体中的数据都动态连接了数据库,所以要每个窗体只能打开一次.关闭该窗体后,再能创建.
请各位高手多多指教!
...全文
104 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
国风 2004-06-30
  • 打赏
  • 举报
回复
谢谢楼上的朋友,我已经解决了问题。原来我在DLL中忘在Uses中加ShareMem了!
nicotine 2004-06-29
  • 打赏
  • 举报
回复
关闭窗口后先free在nil
khzide 2004-06-29
  • 打赏
  • 举报
回复
两种方法,一种是定义一个窗体变量,mFrom,在关闭窗口时,进行一次mForm = nil;
这可以在OnCloseWindow里面进行.
另一种是建立一个互斥对象,就不怕会出现第二个窗体了。方法如下:
procedure OnCreateWindow;
var
mutex : THandle;
mutexName : array [0..7] of char;
begin
StrPCopy(mutexName ,'aaaa3.0');
mutex := openmutex(MUTEX_ALL_ACCESS, False, mutexName);
If mutex = 0 then begin
mutex := createmutex ( nil , true, mutexName);
application.createwindow(FrmMain,TFrmMain);
application.run;
ReleaseMutex (mutex);
end;
end;

国风 2004-06-29
  • 打赏
  • 举报
回复
楼上的兄弟,我试过了不行,程序关闭时还报错了!
我问过别人,代码一样的我这里却出错了。
主程序中动态调用代码:
InvokeDLLForm = function(con:TADOConnection; App: TApplication; Scr: TScreen): TForm;

var
FrMain: TFrMain;
CarInfoForm: TForm;

procedure TFrMain.N13Click(Sender: TObject);
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
begin
DLLHandle := LoadLibrary('carinfodll.dll');
if DLLHandle <> 0 then
begin
@DLLSub := GetProcAddress(DLLHandle, 'CreateCarInfoDLL');
if Assigned(DLLSub) then
begin
CarInfoForm := DLLSub(Frmain.con, Application, Screen);
end;
end;
end;
aiirii 2004-06-28
  • 打赏
  • 举报
回复
>>怎样判断一个DLL窗体已关闭?
Api: FindWindow

or

如果你dll的窗體, 也是共享 主程序的application
那麼, 可以, application.Components 來查找
国风 2004-06-28
  • 打赏
  • 举报
回复
我的DLL代码如下:
uses
SysUtils,
Forms,
Windows,
Messages,
ADODB,
Classes,
Ucarinfo in 'Ucarinfo.pas' {Frcarinfo};

{$R *.res}


var
DLLApp: TApplication;
DLLScr: TScreen;

function CreateCarInfoDLL(con:TADOConnection; App: TApplication; Scr: TScreen):TForm;
begin
Application := App;
Screen := Scr;
condll:=con;
if not assigned(Frcarinfo) then
Application.CreateForm(TFrcarinfo, Frcarinfo); //创建一个Frcarinfo的窗体
result:=frcarinfo;
end;

procedure ExitDLL(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DLLApp;
Screen := DLLScr;
Frcarinfo:=Nil;
end;
end;

exports
CreateCarInfoDLL;

begin
DLLApp := Application;
DLLScr := Screen;
DLLProc := @ExitDLL;
end.

我在主程序中动态调用时,打开窗体关闭后,第二次就无发再打开了,请问我的代码哪里出错了?
国风 2004-06-28
  • 打赏
  • 举报
回复
我是共享主程序的Application的。
具体怎么个写法请祥说,谢谢!

1,183

社区成员

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

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