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로 설치
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 설치 수행
2.node-gyp와 build tool은 이미 설치 한 상태 이기에 node-gyp rebuild수행
# 성공적으로 build 됨
3. npm을 manual install 하기위해 npm형태로 package 수행
# 자동으로 package name과 version정보이름으로 .tgz형태로 저장 됨
4.해당 package파일을 원하는 위치로 copy후 manual install 수행
5. 설치 완료
6. webpack 수행시 warning 발생
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수행 하면 정상 작동