가끔 가다 보면 ctype를 사용하여 예전에 개발되었던 프로그램들을 래핑하여 재사용하는 프로젝트가 있 다. 예전에 개발했던 프로그램의 *.DLL 파일을 ctypes로 불러와서 실행시키게 되면
지금은 개발되지 않는 좋은 프로그램이 있다면 자동화 할 수 있게 되는 것이다.
오늘 이 과정을 기록하려고 한다.
우선 visual studio를 켜보자. *.DLL 파일을 하나 만들고 그 DLL을 ctypes로 불러와서 사용해볼것이다.
새 프로젝트 만들기 > DLL(동적 연결 라이브러리)

맨 처음 프로젝트를 생성하고 나면 다음과 같이

DllMain의 진입점을 정의하는 파일이 생성되어 있음을 알 수 있다.
헤더파일로
#pragma once
// DLL 내보내기 매크로 정의
#ifdef MYMATHLIB_EXPORTS
#define MYMATHLIB_API __declspec(dllexport)
#else
#define MYMATHLIB_API __declspec(dllimport)
#endif
// 내보낼 함수 선언
extern "C" MYMATHLIB_API int Add(int a, int b);
이렇게 해두고 MyMathLib.h로 저장
소스 파일에 MyMathLib.cpp로
#include "pch.h" // 미리 컴파일된 헤더 (필요한 경우)
#include "MyMathLib.h"
// 내보낼 함수 구현
MYMATHLIB_API int Add(int a, int b) {
return a + b;
}
다음과 같이 해두고 저장


다음과 같이 속성을 클릭하자

그럼 구성 속성 > 일반 > C++언어 표준을 17으로 한다.
구성형식이 동적 라이브러리 인지도 확인해주자.

고급에서 대상 파일 확장명이 .dll인지도 확인한다.
구성 속성 > C/C++ > 전처리기 > 전처리기정의에 MYMATHLIB_EXPORTS가 있는지 확인하고 없으면 편집을 눌러서 써넣는다.

이제 이 상태로 빌드 > 솔루션 빌드(B)를 눌러 빌드를 시작하자.


다음과 같이 현재 프로젝트 디렉터리가 보일 것인데
x64 > Debug > MyDLL.dll 이 보일 것이다.

test.py를 편집할 시간이다.
import ctypes
dll_path = r"Q:\Coding\20250904\MyDLL\x64\Debug\MyDLL.dll"
my_dll = ctypes.WinDLL(dll_path)
my_dll.Add.argtypes = [ctypes.c_int, ctypes.c_int]
my_dll.Add.restype = ctypes.c_int
result = my_dll.Add(10, 20)
print(f"10 + 20 = {result}")
다음과 같이 dll의 절대 경로를 설정하고
WinDLL로 DLL을 가져온다.
Add.argtypes로 인수 타입을 추가해주고
Add.restypes로 출력 타입을 정의한다.
이렇게 하게 되면 다음과 같은 결과를 볼 수 있다.


잘 된다.