Electron使用NodeJS扩展模块调用DLL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenhaifeng2016/article/details/74989966

在windows平台,用vs2015开发一个最简单的dll.



由于安装的electron是64位的,所以需要配置编译生成64位的DLL。


把生成的FaceRecognition.dll拷贝到electron应用的目录。

把FaceRecognition.h和FaceRecognition.lib拷贝到nodejs扩展模块的目录。

如果采用LoadLibary这种方式,那就不需要链接lib文件了。

最终的目录结构如下



修改扩展模块的源代码

#include <stdio.h>
#include <stdlib.h>
#include <node.h>
#include "FaceRecognition.h"

#pragma comment(lib, "FaceRecognition.lib")

using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;

void CAMOpen(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();

    char pIn[20];
    char pOut[50];

  int result = CAM_Open(pIn, pOut); //调用DLL
  char buf[10] = {'\0'};

  itoa(result, buf, 10);

    Local<String> value = String::NewFromUtf8(isolate, "cam_open return ");
    value = String::Concat(value, String::NewFromUtf8(isolate, buf));

  args.GetReturnValue().Set(value);
}

void init(Local<Object> exports) {
  NODE_SET_METHOD(exports, "CAMOpen", CAMOpen);
}

NODE_MODULE(FaceRecognition, init)

修改binding.gyp

{
  "targets": [
    {
      "target_name": "facerecognitiondll",
      "sources": [ "FaceRecognition.cpp" ],
      "libraries": [],
      "conditions": [
        [
            "OS == 'win'",
            {
                "link_settings": {
                    "libraries": ["-l ../facerecognition.lib",]
                }
            }
        ]
      ]
    }
  ]
}

模块的package.json定义如下

{
  "name": "facerecognitiondll",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "install": "node-gyp rebuild -target=1.6.11 -arch=x64 -dist-url=https://atom.io/download/atom-shell"
  },
  "author": "",
  "license": "ISC",
  "gypfile": true
}


编译生成模块

npm install


在electron项目中运行npm start,结果如下



小结:

1.开发一个dll,项目名为FaceRecognition

2.开发一个NodeJS的第三方扩展模块,这个模块调用第一步的DLL,相当于做了一层封装。

3.开发一个Electron应用,调用第二步生成的模块,相当于间接调用了第一步的DLL。


展开阅读全文

没有更多推荐了,返回首页