Q&A

  • MDI 주프로그램에서 child Dll프로그램을 실행후 오류
도움을 요청합니다.
주프로그램(MDI)에서 Child Dll프로그램을 실행후 Child Dll프로그램은 종료는 정상으로 되는것 같으나, 주프로그램을 종료시 연산자료 오류가 납니다.

참고)
  1. 이프로그램은 정적으로 Child Dll 프로그램을 호출하여 실행합니다
  2. MDI에서는 client 프로그램을 실행하면 MDIChildCount 에 값이 Child
     갯수만큼 증가 해야 하는데 값이 증가되지 않고 항상 0으로 있음
  3. 아래 주프로그램에 "//FreeLibrary(DLLHandle);" 를 실행하면
      Child Dll를 실행과 동시에 주프로그램이 종료됨
  4. debuging 상태로 체크하여 보니 주프로그램을 종료하면 Child 프로그램
      까지 와서 종료가 되는것 같구요.
  6. 버전는 6입니다.

-- MDI 주프로그램---
  // 이부분은 주프로그램에서 Child Dll를 정적으로 부르는 부분
procedure Tsudof.Button1Click(Sender: TObject);
var
   DLLHandle:THandle;
   showT: procedure(Ap: TApplication; Ss: String);stdcall;
begin
   DLLHandle:=LoadLibrary('tempp.dll');
   if DLLHandle=0 then
     showMessage('tempp.dll을 찾을수 잆습니다.');
   try
     @showT:= GetProcAddress(DLLHandle,'OpenRoom');
     showT(Application,'부프로그램');
   finally
     //FreeLibrary(DLLHandle);
   end;
end;



---- Child Dll ----
library tempp;

uses
  SysUtils,
  Classes,
  Forms,
  Windows,
  tempu in 'tempu.pas' {tempf};


var
  OutApp : TApplication;
{$R *.res}


procedure OutDLLProc(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
    if Assigned(OutApp) then
      Application := OutApp;
end;

procedure OpenRoom(MainApp : TApplication; Ss: String); stdcall;
begin
  if not Assigned(OutApp) then
  begin
    OutApp := Application;
    Application := MainApp;
  end;
  tempf := Ttempf.Create(Application.MainForm);
  tempf.Caption := Ss;
  //tempf.Show;
end;

exports  OpenRoom;
begin
  OutApp := nil;
  DLLProc := @OutDLLProc;
end.

--Child Dll unit 부분----
unit tempu;
'
var
  tempf: Ttempf;
implementation

{$R *.dfm}

procedure Ttempf.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

0  COMMENTS