그러므로 dll에서 얼마든지 메인폼의 객체어 접근도 할수 있고 , 또 얼마든지 메인폼의 public 메소드도 사용할수 있죠
그런데 dll에서 exe의 Form class 를 알수가 없죠
delph에서 컴포넌트를 개발하면 xxx.bpl로 만들어 집니다. *.bpl 파일은 dll의 일종이죠
만약 exe프로그램에서 FormCreate이벤트에 무슨 코드를 넣었다고 합시다.
이 FormCreate 함수는 어디서 호출할까요?
바로 vclxx.bpl 에서 호출합니다. bpl(또는 dll) 에서는 현재 Form의 클래스 구조를 전혀 모르는데...
이것이 가능한 이유는 이벤트 핸들러(함수) 를 걸어 놓았기 때문이죠
다시말해 dll 에 Form을 Show하면서 함수포인터를 하나 넘겨주고 dll에서는 그 함수를 호출하면 된다 뭐 그런것입니다.
이게 코딩하기에 가장 직관적이죠
샘프코드 들어갑니다.
// xxxdll.bpr
function ShowDllForm(App: TApplication;scr:TScreen;parent: TWinControl; func:TCalcEvent): boolean ;
var
frm: TForm2;
begin
Application:=App; // dll을 run-time package를 사용하지 않으면 application객체가 다름
Screen:=scr;
frm:=TForm2.Create(Application);
frm.Parent:=parent; // Form의 Parent 설정
frm.funcRslt:=func; //이벤트 함수 설정
frm.Show;
Result:=true;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
sRslt: String;
begin
sRslt:=IntToSTr( StrToIntDef(Edit1.Text,0)+ StrToIntDef(Edit2.Text,0));
if Assigned(funcRslt) then //설정된 함수가 있으면
funcRslt(sRslt); // 호출한다.
end;
이제 exe 코드입니다.
type
TCalcEvent = procedure(sRslt:String) of object; // 메소드 타입선언
function ShowDllForm(app:TApplication;scr:TScreen; parent: TWinControl; func:TCalcEvent): boolean ; external 'myFormDll.dll' name 'ShowDllForm'
//--------------------------------------------
// dll에서 호출할 메소드
procedure TForm1.OnDllClacResult(str:String);
begin
Edit1.Text:=str;
end;
//--------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
//dll의 Form을 show하도록 dll함수를 호출할때
//Form의 parent와 dll에서 호출할 함수 OnDllClacResult 를 같이 넘긴다.
// application 과 screen을 넘기는 이유는
// dll과 exe가 run-time package를 사용하지 않을경우
// dll에서의 Application객제와 exe에서의 Application객체가 서로 다르기 때문이다.
ShowDllForm(Application,Screen,Panel2,OnDllClacResult);
end;
WM_COPYDATA 를 이용하면 됩니다.
아마도 제일 간단한 방법 같습니다. 그리고 사용법 예제는 이미 많이 올라와 있으니 WM_COPYDAT 로 찾아 보세요. ^^