動的 링크 라이브러리

위키百科, 우리 모두의 百科事典.

動的 링크 라이브러리
Dynamic link library
파일 擴張字 .dll
인터넷 미디어 타입
application/vnd.microsoft.portable-executable
UTI com.microsoft.windows-dynamic-link-library
매직 넘버 MZ
開發 마이크로소프트
다음의 컨테이너 共有 라이브러리

動的 링크 라이브러리 ( 英語 : dynamic-link library , DLL )는 마이크로소프트 윈도우 에서 具現된 動的 라이브러리 이다. 內部에는 다른 프로그램이 불러서 쓸 수 있는 다양한 函數 들을 가지고 있는데, 擴張DLL인 境遇는 클래스 를 가지고 있기도 한다. DLL은 COM 을 담는 그릇의 役割도 한다.

使用하는 方法에는 두 가지가 있는데,

  • 默示的 링킹 (Implicit linking) : 實行 파일 自體에 어떤 DLL의 어떤 函數를 使用하겠다는 情報를 包含시키고 運營體制가 프로그램 實行 時 該當 函數들을 初期化한 後 그것을 利用하는 方法과,
  • 明示的 링킹 (Explicit linking) : 프로그램이 實行 中일 때 API 를 利用하여 DLL 파일이 있는지 檢査하고 動的으로 願하는 函數만 불러와서 쓰는 方法이 있다.

前者의 境遇는 컴파일러가 自動으로 해주는 境遇가 많으며, 後者의 境遇는 使用하고자 하는 DLL이나 函數가 實行 環境에 있을지 없을지 잘 모르는 境遇에 使用된다. (때때로 메모리 節約을 위해 쓰이기도 한다.)

프로그램의 예 [ 編輯 ]

DLL 내보내기(엑스포트) 만들기 [ 編輯 ]

다음의 例는 DLL로부터 심볼(symbol)을 내보내기 위한 言語의 特定한 묶음을 보여 준다.

델파이

 library
 Example
;


 // 두 個의 數를 追加하는 函數

 function
 AddNumbers
(
a
,
 b
:
 Double
)
:
 Double
;
 cdecl
;

 begin

   Result
 :=
 a
 +
 b
;

 end
;


 // 이 函數를 내보낸다

 exports

 AddNumbers
;


 // DLL 初期化 코드. 特別한 핸들링이 必要하지 않다.

 begin

 end
.

C

 #include
 <windows.h>


 // 이 函數 내보내기

 extern
 "C"
 __declspec
(
dllexport
)
 double
 AddNumbers
(
double
 a
,
 double
 b
);


 // DLL 初期化 函數

 BOOL
 APIENTRY

 DllMain
(
HANDLE
 hModule
,
 DWORD
 dwReason
,
 LPVOID
 lpReserved
)

 {

 	return
 TRUE
;

 }



 // 두 個의 數를 더하는 函數

 double
 AddNumbers
(
double
 a
,
 double
 b
)

 {

 	return
 a
 +
 b
;

 }

DLL 가져오기(임포트) 使用하기 [ 編輯 ]

다음의 例는 컴파일할 때 DLL에 맞춰 링크하기 爲한 심볼을 불러오기 위해 어떻게 言語의 特定한 묶음을 使用하는지를 보여 준다.

델파이

 program
 Example
;

 {$APPTYPE CONSOLE}


 // 두 個의 數를 追加하는 函數 가져오기

 function
 AddNumbers
(
a
,
 b
:
 Double
)
:
 Double
;
 cdecl
;
 external
 'Example.dll'
;


 var
 result
:
 Double
;

 begin

   result
 :=
 AddNumbers
(
1
,
 2
)
;

   Writeln
(
'結果는: '
,
 result
)

 end
.

C, C++

政敵 링크를 하기 앞서 Example.lib 파일(Example.dll이 만들어졌다고 하면)이 프로젝트 안에 반드시 있어야 한다. 또, DLL Example.dll을 다음의 코드로 만들어진 .exe 파일이 있는 곳에 複寫해야 한다.

 #include
 <windows.h>

 #include
 <stdio.h>


 // 두 個의 數를 追加하는 函數 가져오기

 extern
 "C"
 __declspec
(
dllimport
)
 double
 AddNumbers
(
double
 a
,
 double
 b
);


 int
 main
(
int
 argc
,
 char
 **
argv
)
 {

 	double
 result
 =
 AddNumbers
(
1
,
 2
);

 	printf
(
"結果는: %f
\n
"
,
 result
);

 	return
 0
;

 }

分明한 런타임 링크 使用하기 [ 編輯 ]

다음의 例는 言語의 特定한 WIN32 API 묶음을 使用하여 런타임 로딩/링크 體系를 使用하는 方法을 보여 준다.

마이크로소프트 비주얼 베이직
 Option
 Explicit

 Declare
 Function
 AddNumbers
 Lib
 "Example.dll"
 _
 (
ByVal
 a
 As
 Double
,
 ByVal
 b
 As
 Double
)
 As
 Double


 Sub
 Main
()

 Dim
 Result
 As
 Double

 Result
 =
 AddNumbers
(
1
,
 2
)

 Debug
.
Print
 "結果는: "
 &
 Result

 End
 Sub

델파이
 program
 Example
;

 {$APPTYPE CONSOLE}


 uses

   Windows
;


 Type

   AddNumbersProc
 =
 function
 (
a
,
 b
:
 Double
)
:
 Double
;
 cdecl
;


 var

   result
:
 Double
;

   hInstLib
:
 HMODULE
;

   AddNumbers
:
 AddNumbersProc
;

 begin

   hInstLib
 :=
 LoadLibrary
(
'example.dll'
)
;

   if
 hInstLib
 <>
 0
 then

   begin

     AddNumbers
 :=
 GetProcAddress
(
hInstLib
,
 'AddNumbers'
)
;


     if
 Assigned
(
AddNumbers
)
 then

     begin

       result
 :=
 AddNumbers
(
1
,
 2
)
;

       Writeln
(
'結果는: '
,
 result
)
;

     end

     else

     begin

       Writeln
(
'誤謬: DLL 函數를 찾을 수 없습니다'
)
;

       ExitCode
 :=
 1
;

     end
;


     FreeLibrary
(
hInstLib
)
;

   end

   else

   begin

     Writeln
(
'誤謬: 라이브러리를 불러올 수 없습니다'
)
;

     ExitCode
 :=
 1
;

   end
;


   ExitCode
 :=
 0
;

 end
.

C

 #include
 <windows.h>

 #include
 <stdio.h>


 // DLL 函數 署名

 typedef
 double
 (
*
importFunction
)(
double
,
 double
);


 int
 main
(
int
 argc
,
 char
 **
argv
)

 {

 	importFunction
 addNumbers
;

 	double
 result
;


 	// DLL 파일 불러오기

 	HINSTANCE
 hinstLib
 =
 LoadLibrary
(
"Example.dll"
);

 	if
 (
hinstLib
 ==
 NULL
)
 {

 		printf
(
"誤謬: DLL을 불러올 수 없습니다
\n
"
);

 		return
 1
;

 	}


 	// 函數 포인터 얻기

 	addNumbers
 =
 (
importFunction
)
GetProcAddress
(
hinstLib
,
 "AddNumbers"
);

 	if
 (
addNumbers
 ==
 NULL
)
 {

 		printf
(
"誤謬: DLL 函數를 찾을 수 없습니다
\n
"
);

                FreeLibrary
(
hinstLib
);

 		return
 1
;

 	}


 	// 函數 要請하기.

 	result
 =
 addNumbers
(
1
,
 2
);


 	// DLL 파일의 로드를 解除한다

 	FreeLibrary
(
hinstLib
);


 	// 結果를 보여 준다

 	printf
(
"結果는: %f
\n
"
,
 result
);


 	return
 0
;

 }

外部 링크 [ 編輯 ]