Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ColorGradingLutPass
- Three(Two) Tone Shading
- Private Bytes
- 벡터
- URP로 변경
- 작업 집합
- Windows Build
- C언어
- Specular
- working set
- Cartoon Rendering
- Toon Shader
- URP
- OculusMotionVectorPass
- Cell Look
- ASW(Application SpaceWarp)
- 메모리 누수
- VR
- Rim Light
- Cell Shader
- 가상 바이트
- 프로그래밍 기초
- AppSW
- 3d
- 개인 바이트
- 게임 수학
- Virtual Byte
Archives
- Today
- Total
WinCNT
Dynamic-Link Library(DLL) - 명시적 링킹(Explicit Linking) 본문
게임 프로그래밍(학습 내용 정리)/시스템 프로그래밍
Dynamic-Link Library(DLL) - 명시적 링킹(Explicit Linking)
WinCNT_SSS 2022. 6. 7. 12:45DLL의 암시적 링킹과 명시적 링킹
DLL의 암시적 링킹(Implicit Linking)인 경우,
로드 타임에 DLL를 로드하기 때문에 프로그래머가 코드에 DLL를 넣지 않는다
(물론 DLL의 lib파일을 포함시켜야 한다)
하지만 DLL의 암시적 링킹의 경우는 DLL이 없을 경우는 실행 자체가 불가능해진다
반면 DLL의 명시적 링킹의 방법은 DLL의 로드가 런 타임 중에 일어나기 때문에
(적절한 예외 처리를 하면)프로그램의 실행에는 문제가 없다
명시적인 DLL 모듈 로딩
std::string path = "../x64/Debug/MyTestDLL.dll";
HMODULE hDll = ::LoadLibraryA(path.c_str());
LoadLibrary는 내부적으로 ANSI로 처리하기 때문에 보통 A를 붙여서 사용한다
명시적인 DLL 모듈 언로딩
::FreeLibrary(hDll);
명시적인 DLL 모듈 사용의 예제
typedef void (*DLL_FIBONACCI_INT)(const unsigned long long a, const unsigned long long b);
typedef bool (*DLL_FIBONACCI_NEXT)();
typedef unsigned long long (*DLL_FIBONACCI_CURRENT)();
typedef unsigned (*DLL_FIBONACCI_INDEX)();
int main()
{
std::string path = "../x64/Debug/MyTestDLL.dll";
HMODULE hDll = ::LoadLibraryA(path.c_str());
if (hDll != NULL)
{
DLL_FIBONACCI_INT pInitFn = (DLL_FIBONACCI_INT)::GetProcAddress(hDll, "fibonacci_init");
DLL_FIBONACCI_NEXT pNextFn = (DLL_FIBONACCI_NEXT)::GetProcAddress(hDll, "fibonacci_next");
DLL_FIBONACCI_CURRENT pCurFn = (DLL_FIBONACCI_CURRENT)::GetProcAddress(hDll, "fibonacci_current");
DLL_FIBONACCI_INDEX pIndexFn = (DLL_FIBONACCI_INDEX)::GetProcAddress(hDll, "fibonacci_index");
pInitFn(1, 1);
do {
std::cout << pIndexFn() << ": "
<< pCurFn() << std::endl;
} while (pNextFn());
std::cout << pIndexFn() + 1 <<
" Fibonacci sequence values fit in an " <<
"unsigned 64-bit integer." << std::endl;
system("pause");
::FreeLibrary(hDll);
}
}
typedef로 함수 포인터를 미리 정의해두고, GetProcAddress로 DLL의 함수 포인터를 반환 받아서
나중에 함수처럼 사용하면 된다
궁금한 점은 typedef 함수 포인터를 대신할 모던 C++ 문법이 없을까하는 것
function<>을 사용하면 더 깔끔해질 거 같긴 하다...?
SSS
'게임 프로그래밍(학습 내용 정리) > 시스템 프로그래밍' 카테고리의 다른 글
TLS(Thread Local Storage) (0) | 2022.06.14 |
---|---|
Dynamic-Link Library(DLL) - 추가 사항 (0) | 2022.06.07 |
Dynamic-Link Library(DLL) (0) | 2022.05.23 |
어플리케이션에서 가상 메모리 사용 방법 (0) | 2022.05.23 |
작업 집합(Working Set), 가상 바이트(Virtual Byte), 개인 바이트(Private Bytes)...그리고 메모리 누수 (0) | 2022.05.16 |