Javascript 调用C++;使用节点ffi napi electron从渲染器进程创建dll
我正在使用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.hJavascript 调用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
#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()
}