DLL
은 여기로 連結됩니다. 다른 뜻에 對해서는
DLL (同音異義)
文書를 參考하십시오.
動的 링크 라이브러리
(
英語
:
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
;
}
外部 링크
[
編輯
]