[Electron] #2. ffi-napi

김상웅·2022년 8월 12일
0

[사이드프로젝트]

목록 보기
8/9

✅ 들어가면서

기업협업 프로젝트를 위해 Electron이라는 크로스 플랫폼을 사용해보았습니다.

데스크탑 애플리케이션을 개발하기 위한 일종의 도구라고 보면 되는데요,

일렉트론을 통해 백그라운드앱에 접근하여 동작을 수행하는 방법에 대해 고민이 필요한 개발이 필요했습니다.

이번 포스팅에서는 백그라운드 앱에 접근하는 ffi-napi에 대해 알아보겠습니다.

문제점!!!

해당 프로젝트는 법적 문제가 있을 수 있어 공개적으로 배포되지 않았습니다. 어떤식으로 백그라운드 앱에 접근할 수 있었는지 간략하게 소개드리겠습니다.



✅ ffi란?

우선 ffi에 대해 알아보겠습니다.

📌 개념

Foreign function interface 의 약자로서 외부 함수 인터페이스라고 부릅니다.

한 프로그래밍 언어로 작성된 프로그램이 다른 언어로 작성된 서비스를 이용할 수 있거나 그에 따른 함수를 호출할 수 있는 것을 가리키는데요.

쉬운 예시를 들어보겠습니다.

Python의 출력 함수는 print()입니다.

반면 Javascript의 출력 함수는 console.log()이죠.

Javascript로 개발을 할 때 python의 print() 함수를 활용할 수 있는 것이 ffi인 것입니다!


📌 ffi-napi

자! 우선 일렉트론은 Node를 기반으로 프로그래밍을 할 수 있는 플랫폼인데요.

Node로 개발을 할 때 어떻게 백그라운드 앱에 접근할 수 있을까요?

바로 ffi-napi라는 모듈입니다.

이 모듈을 사용하여 이미 만들어져 있는 다른 동적 라이브러리 (dll)을 Node에서 바로 로드하여 사용할 수 있습니다.

하지만!

바로 사용하기는 어렵습니다.

우선 프로젝트에서는 c++의 함수를 사용하였기 때문에 c++을 설치해야 했고 그 과정에서 python 2.7버전 등 험난한 과정이 있었습니다.

해당 과정은 아래 Github 주소에서 확인할 수 있습니다. 👇
https://github.com/nodejs/node-gyp


📌 코드 예시

실제 사용했던 코드를 간략하게 돌이켜보면 다음과 같습니다.

우선 dll 함수를 정의하는 코드입니다.


const ffi = require("ffi-napi") // ffi-napi 모듈 불러오기

// ffi Library의 user32의 동적 라이브러리 사용
// 첫번째 인자 : 결과 값 type
// 두번째 인자 : 함수에 필요한 인수의 type 
cosnt user32 = ffi.Library(user32.dll, {
	FindWindowExA: ["long", ["long", "long", "string", "string"]],
});

다음으로 정의된 함수를 사용하여 줍니다.

FindWindowExA() 함수의 세번째 인수로는 window class name이 위치합니다.

window class name을 찾을 수 있는 방법은 여러가지가 있는데, 저는 Window Detective라는 프로그램을 사용하였습니다.

실제로 카카오톡 어플리케이션의 윈도우 핸들 (hwnd)을 찾아보겠습니다!

const hwnd = user32.FindWindowExA(0, 0, "EVA_Window_DblClk", null)

console.log(hwnd) // 결과 값은 숫자 형태의 값이 반환됩니다.

FindWindowExA() 함수는 백그라운드에서 실행 중인 어플리케이션의 윈도우 핸들을 찾아줍니다.

더 많은 함수는 win32-api에서 찾아볼 수 있습니다.



++ 실제 자동화 프로그램을 개발할 때도 유용하게 사용할 수 있을 것 같습니다!

다만, 상업적으로 이용했을 때 자동화 프로그램의 대상이 되는 프로그램으로부터 제재를 받을 수 있다는 점도 유의할 필요가 있을 것 같네요!

profile
누구나 이해할 수 있도록

0개의 댓글