본문 바로가기
Delphi Tip/파일

DLL(Dynamic-link library)란 (1)

by MonoSoft 2023. 6. 21.
728x90
반응형

 

 

DLL(Dynamic-link library)란 (1)

 

 

DLL은 단지 procedure와 function만을 외부에 제공할 수 있다.

DLL이 procedure 나 function의 연결점을 외부에 제공하는 것을 export라고 한다.

 

실행파일에서 DLL의 procedure나 function의 연결점에

연결하는 것은 import라고 부른다.

 

DLL 을 이용하기 위해서는 반드시 DLL의 export된

procedure나 fuction중 사용하고자 하는 것을 import하여야 한다.

 

import는 아주 간단하다. 일반 procedure나 function의 선언에서

stdcall, external, name등의 키워드들을 추가로 사용하면 그만이다.

 

예를들어, Windows API중 "user32.dll"에 들어 있는

MessageBox function을 import하는 방법은 아래 와 같다.

 

function MessageBox(HWnd: Integer; Text, Caption: PChar; Flags: Integer): Integer; stdcall;

external 'user32.dll' name 'MessageBoxA';

 

이렇게 import된 MessageBox function은

일반 델파이의 unit내부의 function과 아무런 차이없이 사용할 수 있다.

 

위의 예는 MessageBoxA라는 DLL내의 function 을

MessageBox라는 function으로 import하였다. 여기서 볼 수 있는 바와 같이,

DLL내의 function이나 procedure의 이름을 import시

다른 이름으로 변경할 수 있다.

 

 

오브젝트 파스칼은 procedure와 function을 다음 세가지 방법으로 import 할 수 있다.

 

1. 이름으로 import한다.
2. 새이름으로 import한다.
3. 인덱스번호로 import한다.

 

 

먼저, 이름으로 import하는 경우를 살펴보자.

인덱스가 없는 경우, 혹은 name절 이 지정된 경우,

procedure나 function은 이름으로 import될 수 있다.

 

DLL은 다 중언어 지원을 주개념으로 하고 있지만

C를 기본모델로 잡고 있다.

 

따라서 '이 름'을 이용하여 import하는 경우 C의 '이름' 규칙을 따라야 한다.

반드시 DLL 내 부의 procedure나 function명과

동일한 스펠링과 대소문자'을 사용해야 한다.

 

특히 대소문자의 구분은 꼭 신경쓰기 바란다. C에서는 같은

스펠링이더라도 대소 문자가 다르면 다른 이름으로 취급한다.

 

procedure SampleProcedureA; external 'testlib.dll';

 

C에서 델파이로 전향하면서 느낀점이라면

오브젝트 파스칼은 그 언어 자 체가 인간중심의 언어라는 것이다.

 

즉, '사람이 이해하기 쉬운' 언어라는 느낌을 강하게 받았다.

대부분의 전산관련 서적의 알고리즘 설명은

파스칼로 이루어진다.

 

코드 자체만으로도 하나의 '도큐먼트'가 되는 것이다.

파스칼 코드를 한번 죽 읽어보라.

그 자체가 하나의 간결한 문장이다.

이에 비해 C는 온갖 암호적인 기호들로 채워진 느낌을 준다.

 

C는 다분히 기계적인 언어이다.

간결하고 축약적 이며 기계적인 것이 C의 스타일이다.

다분히 설명적이며, 프로그래머에 따라 타이핑이

지겹다고 느낄 수도, 혹은 인간적이다라고 좋아할 수도 있는 것이 파스칼 이다.

 

이 점에서 대소문자 구분을 보자. 일반적인 '인간적' 사고에서

스펠링이 같으면 같은 이름이다.

하지만 C는 다른 이름으로 취급한다.

 

다음으로, DLL 내부의 procedure나 function명을

새로운 이름으로 import할 수도 있다.

 

물론 이때에도 DLL 내부의 procedure나 function명을

대소문자 구별하여 지정해 주어야 한다.

대부분의 경우 이 방법을 쓴다.

 

 

procedure SampleProcedure; external 'testlib.dll' name 'SampleProcedureA';

 

마지막으로, DLL내부에 인덱스절이 있는 경우,

procedure나 function을 그 인덱 스값(숫자)로 import할 수도 있다.

DLL내부의 procedure나 function명을

정확히 모를 경우 사용할 수 있다.

 

procedure SampleProcedure; external 'testlib.dll' index 5;

import시 DLL 파일명을 상수(const)로 정의해 이용할 수 있다.

 

상수의 이용으로 import 전체를 변경하지 않고 상수값만 변경하면 된다.

 

const

TestLib = 'testlib.dll';

Ordinal = 5;

procedure SampleProcedureA; external TestLib;

procedure SampleProcedure; external TestLib name 'SampleProcedureA';

procedure SampleProcedure; external TestLib index Ordinal;

 

설명한 바와 같이 아쉽게도 DLL에서 변수를 import할 수는 없다.

하지만 필요한 변수라면 그 값을 읽을 수 있는 function이나 값을 세팅할 수 있는

procedure등 의 인터페이스가 DLL에 존재하기 마련이므로 큰 무리는 없다.

 

 

2편계속...

728x90
반응형

댓글