[node.js] node.js에서 DLL모듈 불러오기 #3(ffi 모듈)

이제 ffi 모듈 설치까지 끝났으니 DLL을 만들고 ffi 모듈을 사용하여 DLL에 있는 함수를 호출해보자

먼저 DLL을 만들어야 하는데, 비주얼 스튜디오에서 DLL 프로젝트를 생성한 다음

아래 코드를 복사해서 컴파일해주자.

dllMain.h
#pragma once

#include <cstdint>


#if defined(WIN32) || defined(_WIN32)
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

#ifdef __cplusplus
extern "C" {
#endif
	
	EXPORT void print(char* c, int* i);
	EXPORT uint64_t factorial(int max);

#ifdef __cplusplus
}
#endif
dllMain.cpp
#include "pch.h"

EXPORT void print(char* c, int* i) {
    printf("c = %s, &c = %p\n", c, c);
	printf("i = %d, &i = %p\n", *i, i);
}

EXPORT uint64_t factorial(int max) {
	int i = max;
	uint64_t result = 1;

	while (i >= 2) {
	    result *= i--;
	}

	return result;
}
pch.h
// pch.h: 미리 컴파일된 헤더 파일입니다.
// 아래 나열된 파일은 한 번만 컴파일되었으며, 향후 빌드에 대한 빌드 성능을 향상합니다.
// 코드 컴파일 및 여러 코드 검색 기능을 포함하여 IntelliSense 성능에도 영향을 미칩니다.
// 그러나 여기에 나열된 파일은 빌드 간 업데이트되는 경우 모두 다시 컴파일됩니다.
// 여기에 자주 업데이트할 파일을 추가하지 마세요. 그러면 성능이 저하됩니다.

#ifndef PCH_H
#define PCH_H

// 여기에 미리 컴파일하려는 헤더 추가
#include <cstdio>
#include "framework.h"
#include "dllTest.h"

#endif //PCH_H
framework.h
#pragma once

#define WIN32_LEAN_AND_MEAN             // 거의 사용되지 않는 내용을 Windows 헤더에서 제외합니다.
// Windows 헤더 파일
#include <windows.h>

dll 프로젝트를 생성하면 pch.h와 framework.h가 기본적으로 생성되고 dllmain.cpp에 include 되어있다.

나는 cpp에 include가 최대한 깔끔해보이는걸 원해 헤더파일은 pch.h에 다 때려넣고 cpp에서는 pch.h만 포함시켰다.

 

소스코드를 모두 작성했으면 컴파일을 해 DLL 파일을 생성하자.


DLL파일을 생성했으면 이제 node.js에서 DLL을 불러와보자.

DLL 파일은 index.js 파일이 있는 위치와 같은 곳에 복사해주어야 한다.

index.js
// 1. ffi 모듈 불러오기
const ffi = require('ffi')

// 2. DLL을 불러오고 DLL에서 사용할 함수 정의
const libfactorial = ffi.Library('./dllTest_x64', {
    'factorial': [ 'uint64', [ 'int' ] ]
})

// 3. DLL의 함수를 호출하고 결과 출력
let result = libfactorial.factorial(4);
console.log(result) // expected result = 24, (4 X 3 X 2 X 1 = 24)

여기서 핵심은 2.인데 ffi.Library() 함수가 DLL을 불러오는 함수다.

첫번째 인자로 DLL 파일의 경로를 넣어준다. 확장자(.dll)는 빼고 넣어야 한다.

두번째 인자로 DLL에서 사용할 함수를 명시한다.

왼쪽부터 함수명, 리턴타입, 매개변수 타입이다.

위에 DLL 소스코드를 다시 한 번 본다면 이해가 더 빨리 될 것이다.

댓글

Designed by JB FACTORY