'IInterfaceComponentReference'에 해당되는 글 1건

  1. 2010/02/09 델파이 - DLL 에서의 객체 전달.

델파이 - 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 을 만들고.

library testDLL;

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와도 잘 될것 같다. (안해봤지만 되겠지.....)

저작자 표시 비영리 변경 금지
Trackback 0 : Comment 0

Trackback Address :: http://blog.nul.kr/trackback/259 관련글 쓰기

Write a comment

태그 앞에 붙여 넣습니다. -->