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