node-ffi를 사용한 dll 연동 을 위한 node-ffi설치

electron에서 dll 연동을 위해 node-ffi를 사용할 예정

먼저 npm에서 node-ffi인 ffi를 설치 수행시 error 발생

$npm install -s ffi
...\node_modules\ref>if not defined npm_config_node_gyp 
(node "C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js"
 rebuild )  else (node "" rebuild )

ffi를 사용하기 위해 node-gyp + window build tools 필요해서 발생

1.node-gyp를 global로 설치

$npm install -g node-gyp

2. window build tools를 global로 설치

$npm install --g windows-build-tools
//자동으로 python2.7 설치
Downloading BuildTools_Full.exe
Downloading python-2.7.13.msi
Starting installation...

6. ffi 설치시 설치 중 오류 발생

$npm install -s ffi
...
if not defined npm_config_node_gyp (node "C:\Users\scanhand\AppData\Roaming\npm\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\....\node_modules\node-gyp\bin\node-gyp.js" rebuild ) else (node "C:\Users\scanhand\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" rebuild )
...
Building assembly file ......\deps\libffi\src\x86\win64.asm
Assembling: ......\deps\libffi\src\x86\win64.asm
prep_cif.c
types.c
raw_api.c
java_raw_api.c
closures.c
ffi.c
win_delay_load_hook.cc
ffi.vcxproj -> E:\work\DICOMViewer\electron\resources\app\JS\node_modules\ffi\build\Release
\libffi.lib
ffi.cc
callback_info.cc
threaded_callback_invokation.cc
win32-dlfcn.cc
win_delay_load_hook.cc
..\src\ffi.cc(111): error C2664: 'v8::Maybe v8::Object::ForceSet(v8::Localv8::Context
,v8::Localv8::Value,v8::Localv8::Value,v8::PropertyAttribute)': cannot convert argument 3
from 'v8::PropertyAttribute' to 'v8::Localv8::Value' [E:\work\DICOMViewer\electron\resourc
es\app\JS\node_modules\ffi\build\ffi_bindings.vcxproj]
..\src\ffi.cc(111): note: No user-defined-conversion operator available that can perform th
is conversion, or the operator cannot be called
...

node-ffi가 node v9.3.0를 아직 지원하지 않아 발생 되는듯 함

  • 쉬운 해결책으로는 node를 v8.9.4 Version으로 재설치
  • node-ffi의 github(https://github.com/node-ffi/node-ffi) 에서 manual install 시도

    1.먼저 github에서 clone 후 npm 설치 수행

    $npm install
    

    2.node-gyp와 build tool은 이미 설치 한 상태 이기에 node-gyp rebuild수행
    # 성공적으로 build 됨

    $node-gyp rebuild
    

    3. npm을 manual install 하기위해 npm형태로 package 수행
    # 자동으로 package name과 version정보이름으로 .tgz형태로 저장 됨

    $npm pack
    ffi-2.2.0.tgz
    

    4.해당 package파일을 원하는 위치로 copy후 manual install 수행

    $npm i -s ffi-2.2.0.tgz
    

    5. 설치 완료

    6. webpack 수행시 warning 발생

    Warning : Critical ....
    

    7. index.js source에 require(‘ffi’) 수행시 아직도 error발생

    8. webpack으로 bundle 수행시 정상적으로 bundle이 되지 않아 error 발생

    9. main page인 index.html page에 javascript source를 직접 삽입 시도

    <script type="text/javascript>
    var ffi = require('./JS/node_modules/ffi');
    </script>
    

    10. npm start를 통해 electron 수행시 error 발생
    Error: A dynamic link library (DLL) initialization routine failed.

    11.modules를 electron-rebuild를 통해 다시 rebuild를 수행 하라고 한다.
    먼저 electron-rebuild를 설치 후

    npm install --save-dev electron-rebuild
    

    12.electron-rebuild 수행. ffi module을 자동으로 rebuild수행 됨

    ./node_modules/.bin/electron-rebuild
    \ Building module: ffi, Completed: 0
    

    13.다시 재 수행시 정상 실행 됨

    중요) 결론적으로
    1. Node를 8.X.X로 설치하고
    2. node-gyp및 window build 설치 하고
    3. node-ffi를 webpack으로 사용하지 않고
    4. electron-rebuild를 통해 rebuild수행 하면 정상 작동