델파이 - DLL 에서의 객체 전달.
PROG. 2010/02/09 14:21방법이야 여러가지겠지만... Interface를 사용하는 방법이 가장 깔끔하고 확실하다.
Interface란 넘이 원래 이런 용도로 만들어진거니까...
(다중 상속에도 쓰이지만, 가능한한 직접 만드는 라이브러리에 다중 상속을 사용하지는 않는다.)
깔끔한 이유는
델파이의 TComponent 가 Interface로 부터 상속 받았기 때문으로...
따로 Interface 를 만들 필요 없이 그냥 가져다 쓰면 된다.
TComponent는 아래과 같이 선언되어 있다.
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
private
...
...
IInterfaceComponentReference 을 주목 !!!
IInterfaceComponentReference = interface
['{E28B1858-EC86-4559-8FCD-6B4F824151ED}']
function GetComponent: TComponent;
end;
GetComponent라는 함수가 TComponent를 리턴,
즉 인터페이스를 사용하여 해당 컴포넌트 객체를 얻을 수 있다는 뜻이다.
예를 들어 아래의 같이 DLL 을 만들고.
uses
Classes,
fDllForm in 'fDllForm.pas' {frmDllForm};
{$R *.res}
function Create_DllForm: IInterfaceComponentReference; stdcall;
begin
Result := TfrmDllForm.Create(nil);
end;
exports
Create_DllForm,
begin
end.
아래와 같이 쓸 수 있다.
...
...
function Create_DllForm: IInterfaceComponentReference; stdcall; external 'testDLL.dll' name 'Create_DllForm;
implementation
var
compRef: IInterfaceComponentReference
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
compRef := Create_DllForm;
TForm(compRef.GetComponent).Show;
end;
...
...
아 이 얼마나 깔끔하고 직관적인가 ㅜㅜ
장점
1. Build with runtime pacakges 옵션을 안 넣어도 된다. (이 옵션을 넣으면 리모트 디버깅이 잘 안됨 - D2007)
2. 포인터 사용으로 머리 아플 필요가 없다.
3. CodeGear 형제인 C++ Builder와도 잘 될것 같다. (안해봤지만 되겠지.....)

