DLL中MDI窗口调用问题,在线等待,请指教! (50分)

  • 主题发起人 主题发起人 the19hells
  • 开始时间 开始时间
T

the19hells

Unregistered / Unconfirmed
GUEST, unregistred user!
因本人刚学,估计问题不少,所以先送50分,先谢谢了各位。
问题如下,我用以下方法在主窗口中调用子窗口
procedure TMainForm.O_rsExecute(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild;
Mutex:THandle;
begin
Mutex:=CreateMutex(NIL,True,'TOFrom_rs');
IF GetLastError=ERROR_ALREADY_EXISTS THEN
begin
MessageBox(0,'已有一个窗体运行!','提示!',mb_OK);
ReleaseMutex(Mutex);
end
else begin
DllHandle := LoadLibrary('o.dll');
try
ProcAddr := GetProcAddress(DllHandle, 'Createform');
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(Application,Self);
Speedbutton1.Enabled :=False;
end;
except
FreeLibrary(DllHandle);
end;
end;


end;

以下为DLL中的函数:
library o;

uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
Activex,
O_rs in 'O_rs.pas' {OForm_rs};

var
DllApplication: TApplication;

procedure Createform(ParentApplication:TApplication;ParentForm:TForm); export; stdcall;
var
OForm_rs: TOForm_rs;
begin
Application:=ParentApplication;
OForm_rs:=TOForm_rs.Create(ParentForm);
OForm_rs.MyParentForm:=ParentForm;
OForm_rs.MyParentApplication:=ParentApplication;
OForm_rs.Show;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;

Exports
Createform name 'Createform';

{$R *.res}

begin
CoInitialize(Nil);
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.

运行时发现,只在第一次执行时才可以调出子窗口,关闭子窗口后再执行会提示‘已经存在’,但是不关闭子窗口执行调用时也能提示‘已经存在’,反复不得其解,望赐教!谢谢!
 
各位高手,我在线等待,望指点迷津!
 
procedure TMainForm.O_rsExecute(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild;
Mutex:THandle;
begin
Mutex:=CreateMutex(NIL,True,'TOFrom_rs');
IF GetLastError=ERROR_ALREADY_EXISTS THEN
begin
MessageBox(0,'已有一个窗体运行!','提示!',mb_OK);
end
else begin
DllHandle := LoadLibrary('o.dll');
try
ProcAddr := GetProcAddress(DllHandle, 'Createform');
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(Application,Self);
Speedbutton1.Enabled :=False;
end;
except
FreeLibrary(DllHandle);
end;
end;

ReleaseMutex(Mutex);// Any case, you should release it.
end;
 
你好,多谢指教。我先试试!
 
我试了一下,不行!还是无法在关闭后,重新打开子窗口!
不过,多谢Li兄的参与我就送你10分,^_^,不要嫌弃 !
那位高手再指点一下!
 
不好意思,人数不够,那位高手再来,快下班了!

等的心急 啊!屁股糊了!
 
各位老大们,50分是不是少了点?怎么没有人回答啊!

郁闷!
 
郁闷,郁闷,郁闷!
GOD Save Me!
 
It can do!!!
ReleaseMutex(Mutex); ///////////
// this line changed to
CloseHandle(Mutex);
 
我再试!郁闷!
 
[Fatal Error] Required package 'ExtCtrl' not found

?????
 
Li兄,你好。我试了,可是还是不行。郁闷!
 
How about this simple code? I can't believe why it can't do!!!
procedure TForm1.Button1Click(Sender: TObject);
var
Mutex: THandle;
begin
Mutex := CreateMutex(nil, True, 'TEST_Mutex');
if GetLastError = ERROR_ALREADY_EXISTS then
MessageBox(0, 'Existing','Hint',MB_OK)
else
ShowMessage('Running');
CloseHandle(Mutex);
end;

 
Li兄,你好。是这样子的:我打开后关闭,再打开,正常;打开,再打开,提示‘已经存在窗体’,正常;然后关闭,再打开,却还提示‘已经存在窗体’。不知你遇到这样子的问题没? 还望指点!
 
我在想,是不是我调用MDI窗体的方法不对?
还是不该将窗体封装到DLL中?
唉!郁闷之极!
 
子窗体的OnClose事件中加上 action := cafree;
 
To:影子
我已经加上Action:=Cafree 了!
 
使用FindWindow吧
 
后退
顶部