본문 바로가기
C++ Programming

[C++] DLL 만들기(Visual Studio)

by TYB 2024. 10. 23.
반응형

새 프로젝트 -> DLL 선택

 

최초 생성하면 아래 코드가 기본으로 있음.

// dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다.
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

 

외부에서 불러다가 사용할 함수 추가

// dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다.
//#include "pch.h"
#include <Windows.h>

// 외부로 내보낼 함수 정의
extern "C" __declspec(dllexport) void MyFunction() {
    MessageBox(NULL, "MyFunction is called!", "DLL Message", MB_OK);
}

extern "C" __declspec(dllexport) int Add(int a, int b) {
    return a + b;
}


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

 

상단 툴바 -> 프로젝트 -> 속성
구성 Release로 변경
런타임 라이브러리 항목이 다중 스레드 DLL로 되어 있는지 체크
링커 항목으로 가서 출력될 DLL 파일이 어디에 생성될 지 확인.


문제 1. 미리 컴파일된 헤더 pch.h가 있는 경우 주석처리하고

사용안함 체크

 

문제 2. 오류 C2664 'int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)': 인수 2을(를) 'const char [22]'에서 'LPCWSTR'(으)로 변환할 수 없습니다. 
발생할 경우

고급 -> 문자집합 : 유니코드 -> 멀티바이트로 변경

 

 


 

프로젝트 속성을 Release로 설정해놨기 때문에 컴파일 옵션도 Release로 세팅

로컬 Windows 디버거 왼쪽에 있는 컴파일 설정을 Release에 x64로 세팅.

 

F5 누르면 아래처럼 팝업이 뜨는데 DLL은 다른 코드가 실행 될 때 멀티스레드로 도는 형식이므로 혼자서 돌라고 만들어 진게 아니라서 그런거임. 

동적 라이브러리 라는 이름 그대로 코드 실행 되는 타이밍에 실행되는 라이브러리 라고 생각하면 될듯.

 

아까 봤던 출력파일 경로를 보면 이렇게 .dll이 생성되어 있는 걸 볼 수 있을거임.

 

 

이렇게 하면 dll은 준비가 된거고 다음 글에서 dll 로드 및 dll 함수 사용해보도록 하겠음.


 

[C++] DLL 로드해서 사용하기

DLL 만들기(Visual Studio)최초 생성하면 아래 코드가 기본으로 있음.// dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다.#include "pch.h"BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved

program-developers-story.tistory.com

 

반응형