怎样判断一个DLL窗体已关闭?
我用fsMDIForm窗体方式.每个DLL窗体中的数据都动态连接了数据库,所以要每个窗体只能打开一次.关闭该窗体后,再能创建.
请各位高手多多指教!
我用fsMDIForm窗体方式.每个DLL窗体中的数据都动态连接了数据库,所以要每个窗体只能打开一次.关闭该窗体后,再能创建.
请各位高手多多指教!
解决方案 »
- delphi 中几个按钮公用一个事件,当按下时怎样在事件中判断按下的是那个按钮?
- 谁有 Installshield7 的中文教程
- indy udpserver 封装在dll中,但是无法触发 UDPRead 接收事件!
- 关于多线程的问题。
- 怎么用DELPHI进行数据库的备份..目标数据库名自己能指定.最好还能给数库设置密码
- 我应该怎么样编写这样的dll呢?请高手发表点意见。
- 怎么样从另一个Form中获取数据。
- 调试COM组件的问题
- 怎样实现多表查询?
- 有关socket数据传输的问题。
- 大家喜欢用TDBGrid还是TStringGrid网格控件作为批量录入呢?
- 关于DLL窗体中动态连接数据库的问题!!在线等!!急急...
Api: FindWindowor如果你dll的窗體, 也是共享 主程序的application
那麼, 可以, application.Components 來查找
具体怎么个写法请祥说,谢谢!
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.我在主程序中动态调用时,打开窗体关闭后,第二次就无发再打开了,请问我的代码哪里出错了?
我问过别人,代码一样的我这里却出错了。
主程序中动态调用代码:
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;
这可以在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;