Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用C++;使用节点ffi napi electron从渲染器进程创建dll_Javascript_C++_Node.js_Electron - Fatal编程技术网

Javascript 调用C++;使用节点ffi napi electron从渲染器进程创建dll

Javascript 调用C++;使用节点ffi napi electron从渲染器进程创建dll,javascript,c++,node.js,electron,Javascript,C++,Node.js,Electron,我正在使用electron创建一个windows应用程序。我想用FFI NAPI来调用C++。为此,我编写了下面的代码(共享C++和电子代码)。我在“Passing_Dll.js”文件上卡住了,在单击开始和停止按钮时,该文件没有用id=“GenName”更新标签。我的意思是ces.start()或ces.stop()函数在“Passing_Dll.js”文件中不起作用。我试图将这一行document.getElementById('GenName').innerHTML=“Dummy strin

我正在使用electron创建一个windows应用程序。我想用FFI NAPI来调用C++。为此,我编写了下面的代码(共享C++和电子代码)。我在“Passing_Dll.js”文件上卡住了,在单击开始和停止按钮时,该文件没有用id=“GenName”更新标签。我的意思是ces.start()或ces.stop()函数在“Passing_Dll.js”文件中不起作用。我试图将这一行document.getElementById('GenName').innerHTML=“Dummy string”放在“Passing_Dll.js”文件的var ffi=require(“ffi napi”)行之后,并意识到它甚至没有在GUI中显示Dummy string。但如果我将同一行document.getElementById('GenName').innerHTML=“Dummy string”放在ces.start(())和ces.stop()之前的“Passing_Dll.js”文件的start和stop函数中,那么它就显示了“Dummy string”。有人能告诉我我做错了什么吗?为什么它不执行“Passing_Dll.js”正确。我们是否需要对main.js或package.json文件执行某些操作。请建议。如果您可以发送一些工作代码片段,这将非常重要

dll.h

#ifdef DLL1_EXPORTS
#define DLL1_API __declspec(dllexport)
#else
#define DLL1_API __declspec(dllimport)
#endif

enum GUIENUM
{
    START = 0,
    STOP,
    DEBUG,
    STATUS,
};

typedef bool(*Callback)(bool, const char*);
extern "C" DLL1_API BOOL Connect(const char *userName, const char *password, Callback callback);

typedef void(*callbackMethod)(int statustype, const char* status);
extern "C" DLL1_API void GetCallMethod(callbackMethod callback);

extern "C" DLL1_API void Start();
extern "C" DLL1_API void Stop();
dll.cpp

#include "pch.h"
#include "framework.h"
#include "Dll1.h"
callbackMethod m_callback;

// This is an example of an exported variable
DLL1_API BOOL Connect(const char *userName, const char *password, Callback callback)
{
    callback(true, "User is connected");

    return true;
}

DLL1_API void GetCallMethod(callbackMethod callback)
{
    m_callback = callback;
    m_callback(START, "Initializaition is done");
}

DLL1_API void Start()
{
    m_callback(STATUS, "Start is pressed");
}

DLL1_API void Stop()
{
    m_callback(DEBUG, "stop is pressed");
}
index.html

<html>
 <head>
 <meta charset="UTF-8">
 <title>SIMS_R 5.2.10.2 GEN1.2 -AppFLR</title>
 </head>
 <body>
    <label for="name" id ="GenName">R 16_31_80D7_99</label><br>
    <button type="button" onclick="startFunction()" value="Display" >Start</button><br>
    <button type="button" onclick="stopFunction()" value="Display2">Stop</button><br>   
    <script src="Passing_Dll.js"></script>
 </body>
 </html>
传递_Dll.js

const{BrowserWindow} =require("electron");
const app=require('electron').app;

function createWindow() {
    // Create the browser window.
   mainWindow = new BrowserWindow({width:600, height: 650});
  
   // Disable menu
   mainWindow.setMenu(null)
    
   // and load the index.html of the app.
   mainWindow.loadURL('file://'+__dirname+'/index.html')
}
app.on('ready',createWindow);
var ffi =require("ffi-napi");
var ref =require("ref-napi");
var Enum = require('enum')
var constString = ref.types.CString;
var bool = ref.types.bool;
var int = ref.types.int;
var enumCallback = new Enum({  'START': 0,
  'STOP': 1,
  'DEBUG': 2,
  'STATUS': 3
}); 

var callback = ffi.Callback(bool, [bool, constString], function (sec, data) {
    console.log(sec)
    console.log(data);
  
  });

var callback2 =ffi.Callback(ref.types.void, [int, constString], function (sec, data) {
    switch(sec)
    {
      case enumCallback.START.value: 
       console.log(sec);
       console.log(data);
       document.getElementById('GenName').innerHTML = data;
       break;
       case enumCallback.STOP.value: 
       console.log(sec);
       console.log(data);
       document.getElementById('GenName').innerHTML = data;
       break;
       case enumCallback.STATUS.value: 
       console.log(sec);
       console.log(data);
       document.getElementById('GenName').innerHTML = data;
       break;
       case enumCallback.DEBUG.value: 
       console.log(sec);
       console.log(data);
       document.getElementById('GenName').innerHTML = data
       break;
       default:
        console.log(sec);
        console.log(data);
        document.getElementById('GenName').innerHTML = data
        break;
    }
});

var libloc = "./Dll1.dll";
  
const ces = ffi.Library(libloc, {
  'Connect': [bool, [constString, constString, 'pointer']],
  'GetCallMethod':[ref.types.void, ['pointer']],
  'Start': [ref.types.void,[ ]],
  'Stop': [ref.types.void,[ ]],
  
});

module.exports = ces;

var maxLength = 200;
var nameBuffer1 = Buffer.alloc(maxLength);
nameBuffer1.fill(0); 
nameBuffer1.write("user", 0, "utf-8"); 


var nameBuffer2 = Buffer.alloc(maxLength);
nameBuffer2.fill(0); 
nameBuffer2.write("password", 0, "utf-8");

ces.Connect(nameBuffer1,nameBuffer2,callback)
ces.GetCallMethod(callback2)
  
function startFunction()
{
    ces.Start()
}
  
function stopFunction()
{
    ces.Stop()
}