티스토리 뷰

<=================== 추가 2023.02.27 VisualStudio2022 기준 (32비트 프로젝트)

Calculator.zip
0.61MB

1. Calculator.Dll 프로젝트 만들기

 

어플리케이션 종류는 종적 연결 라이브러리 를 선택한다.

 

아래 SwapDll.cpp 와 SwapDll.h 코드로 Calculator.cpp 와 Calculator.h 를 프로젝트에 추가하고 컴파일 하면 아래와 같이 DLL 와 LIB 만들어진다.

 

콘솔용 새 프로젝트 만들고 cpp 새항목 추갛 후 ExplicitDllTest.cpp 코드 참고해서 코드를 추가하고 실행한다.

===================>

 

암시적 연결방식 처럼 SwapDll.lib 는 필요없고, 필요할 때 DLL 만 로드해서 사용한다.

WIN32 콘솔응용프로그램 프로젝트를 선택하고, 아래 그림에서 DLL을 선택한다.



HModule LoadLibrary(LPCTSTR DLL파일명) // DLL 을 로드(매핑)한다.
FARPROC GetProcAddress(HMODULE hModule, LPCSTR 함수명) // 로드된(매핑) DLL 에서 함수주소(함수포인터)를 얻는다.
BOOL FreeLibrary(HMODULE hModule) // 로드된 DLL 언로드(매핑해제)한다.

**** 암시적 연결방식에서는 묵시적 연결방식과 달리 extern "C" 가 필요하다.

<SwapDll.cpp 소스>

extern "C" ____declspec(dllexport) // DLL에서 외부에 제공할 함수 선언
void swap(int* v1, int* v2)
{
   int temp = *v1;
   *v1 = *v2;
   *v2 = temp;
}

<SwapDll.h 소스>

extern "C" __declspec(dllimport) // 실행파일에서 Dll 로부터 제공받을 함수 선언
void swap(int* v1, int* v2);



<ExplicitDllTest.cpp 소스>

#include <stdio.h>
#include <tchar.h>
#include <windows.h> // 추가

#include "SwapDll.h"

typedef void (*SWAP_FUNC)(int*, int*);

int _tmain(int argc, TCHAR( argv[])
{
    HMODULE hinstLib;
    SWAP_FUNC SwapDunction;

   hinstLib = LoadLibrary(_T("SwapDll"));
   if(hinstLib == NULL)
   {
        _
tprintf(_T("DLL 로드 실패\n"));
        return -1; 
    }
    SwapFunction = (SWAP_FUNC)GetProcAddress(hinstLib, _T("swap"));
    if(SwapFunction == NULL)
    {
        _tprintf(_T("함수주소 얻기 실패\n"));
        return -1;
    }

    int a = 10;
    int b = 20;
    _tprintf(_T("변경 전 : %d, %d"), a, b);
    SwapFunction(&a, &b);

// swap 이 아닌 DLL 에 있는 swap() 의 주소를 얻어 호출한다.

 
    _tprintf(_T("변경 후 : %d, %d"), a, b);

    BOOL isSuccess = FreeLibrary(hinstLib);
    if(isSuccess == NULL)
    {
        _tprintf(_T("DLL 언로드 실패\n"));
        return -1;
    }
    return 0; 
}

코드는 목잡하나 아래 3가지 장점이 있다.
1. DLL 이 필요한 시점에서 로딩하고 불필요해지면 반환하기 떄문에 메모리가 절약된다.
2. 프로그램 실행중에 DLL 교체 및 선택이 가능하다.
3. DLL을 필요한 순간에 1개씩 로딩할 수 있어 실행 시간이 짧고, DLL 로딩 시간을 분산시킬 수 있다.

단점은, 코드가 복잡하고 사용하기 어렵다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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