'DLL'에 해당되는 글 2건

  1. 2010/02/09 델파이 - DLL 에서의 객체 전달.
  2. 2009/11/26 OpenCV + Delphi

델파이 - 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


OpenCV + Delphi

PROG. 2009/11/26 22:34

어차피 DLL 인 라이브러리라 델파이에 못 붙일 것도 없죠
델파이용 DLL 헤더 만드는 일은 늘상있는 일이기도 하고요
그렇지만 전체 헤더를 몽땅 변환하는 건 정말 고되고도 재미 없는 작업입니다.
그래서 보통은 그때 그때 필요한 함수와 타입만을 끄집어 냅니다.
계속 같은 작업을 하다 보면 저절로 분량도 많아지고
같은 작업을 안하다보면 별로 쓸일이 없는 거니 굳이 전체 헤더 변환을 할필요가 없겠죠
(물론 시간만 된다면야 못할것도 없지만...)

아무튼 이번에도 그런식으로....
OpenCV 를 이용한 템플릿 매칭(Template Matching) + 소스 포함 이곳의 소스를 테스트 삼아 델파이로 컨버전 했습니다.

Source / exe / dll 포함



굳이 델파이로 헤더까지 만들어 쓸 필요가 있을까.... 싶을지도 모르겠지만

  1. 헤더 만들기가 그리 어려운게 아니고
  2. 헤더 만들다 보면 자연스럽게 함수 원형에 구조체나 자료 구조를 파악하게 됩니다.
  3. 가공할만한 델파이의 GUI 개발 능력에 편승할 수 있습니다.
  4. 특히 http://graphics32.org 와 연동하면 빠르고 화려한 GUI를 구성할수 있습니다... 그것도 무료로 (너무 오래된 거라 좀... 그렇지만... 아직까지도 몹시 쓸만합니다. MIL 에도 붙여 보았었죠)
  5. C 보다는 파스칼이 C++ 보다는 오브젝트 파스칼이 버그 유발 확률을 현저하게 줄여 줍니다.
  6. 알고리즘을 완벽히 파악한다면 GPU 활용에 쓰일 수도 있겠군요 (음 이건 C/C++도 마찬가지네)

위 샘플 이외에도 몇가지 더 돌려봤습니다.
그것들을 클래스로 단순화 / 캡슐화도 해봤고요.
꽤 쓸만합니다.

여가 시간이 많아진다면 계속 해보고 싶네요.
현업 때문에 쉽지는 않겠지만 가급적이면 OpenCV 의 사용을 줄이고 직접 알고리즘을 작성해 봤으면.... 하는데 ...




 

저작자 표시 비영리 변경 금지
tags : Delphi, DLL, OpenCV, Source
Trackback 0 : Comment 0

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

Write a comment

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