Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[214] DLL+
김도완 [purplecofe2] 4650 읽음    2007-06-18 12:36
DLL+(가칭, 특별히 이 방법론의 다른 이름은 없는 것 같습니다)의 핵심은 DLL에서 구현된 클래스를 가져와서 사용하는 것입니다. BPL과 같은 복잡한 방법론보다는 쉬운 방법으로 델파이 버전에 영향의 거의 받지 않습니다.

이는 추상화된 클래스 라이브러리의 기반 유닛과 그리고 그 추상 클래스가 구현된 DLL을 구현하여 기반 클래스(부모 클래스가 맞겠죠)의 형태로 실제 사용하는 곳에서 오브젝트를 정의하여 DLL에서 외부에서 참조할 수 있는 생성자를 이용하여 인스턴스를 할당하여 해당 클래스를 사용케 하는 방법입니다.

이는 BPL 사용보다는 단순하고 효율적인 방법으로 유지보수도 아주 편합니다.

자, 이제 실제적인 코딩으로 들어가봅시다.

1. 베이스 클래스를 정의하는 기반 유닛의 생성.
이 방법론에서 베이스 클래스 유닛은 DLL과 사용부를 연결하는 역할을 한다고 볼 수 있습니다. 이곳에서는 추상화 클래스를 선언하여 DLL과 이를 사용하는 사용부에서 그들의 메소드나 프로퍼티 등등을 접근할 수 있습니다.

 unit myclassbase;
 
 uses classes;

 interface
   type
     TMyClass = class
       private
       protected
       public
         someval : integer;
         function getvalue:integer; virtual; abstract;
     end;

 implementation

end.


이렇게 간단히 구현이 끝났습니다.
변수들의 선언도 이 기반 클래스에서 해야 합니다.

2. DLL에서의 구현.
DLL에서의 구현은 아주 간단합니다. 계승된 클래스를 그냥 그대로 구현을 하면 됩니다. 그리고 DLL에서 생성된 인스턴스를 되돌리기 위해 외부에서 참조할 수 있는 export 함수를 하나 더 만들어줘야 합니다.

library myclassdll;

 uses classes, sysutils, myclassbase;

 type
   TMyClassDLLImp = class(TMyClass)
     private
       FValue : integer;
     protected
     public
       constructor Create;
       destructor Destroy; override;
       function getvalue:integer; override;
   end;

   constructor TMyClassImp.Create;
   begin
     inherited;
     someval := 123456;
     FValue := 67890;
   end;

   destructor TMyClassImp.Destroy;
   begin
     inherited;
   end;

  function TMyClassImp.getvalue:integer;
  begin
    result := FValue;
  end;

 function CreateMyClass:TMyClassImp; stdcall;
 begin
   result := TMyClassImp.Create;
 end;

 exports CreateMyClass;

 begin
 end.


자 이로써 구현도 끝났습니다.

이제 남은 것은 사용하는 것입니다.

3. DLL의 사용.
이제 클래스를 사용할 수 있습니다. 먼저 uses절에 기반 클래스를 포함하고 DLL에 export된 함수를 사용할 수 있도록 한 다음, 기반 클래스로 오브젝트를 정의한 다음 DLL에서 export된 생성함수로 인스턴스를 넘겨서 실제로 사용을 하면 됩니다.

 program myclasstest;

 {$APPTYPE CONSOLE}

 uses sysutils, myclassbase;

 var
   MyClassInst : TMyClass;

 // DLL의 export 생성자를 정의.
 function CreateMyClass:TMyClass; stdcall; external 'myclassdll.dll';

 begin
   // 클래스 인스턴스 생성.
   MyClassInst := CreateMyClass;
   writeln(MyClassInst.getvalue);
   writeln(MyClassInst.someval);
   MyClassInst.free;
 end.


이렇게 사용 방법은 간단합니다. 물론 동적으로 선언하여 생성자 export 함수를 사용할수도 있습니다.


참고하시길.

내용 출처 : pascal newsletter #52

+ -

관련 글 리스트
214 DLL+ 김도완 4650 2007/06/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.