求教一个NodeJs调用Delphi编写的DLL库的思路(Nodejs)
求教一个NodeJs调用Delphi编写的DLL库的思路(Nodejs)
大家好,如题,希望求教一个NodeJs调用Delphi(Object Pascal)编写的DLL(ActiveX library)库的思路。
公司的项目正在向NodeJS的平台移动,但是负责计算核心编写的同事只会用Delphi写DLL,调用DLL中的函数后会生成几个Delphi编写的Record data Type的二进制文件,类似C里的structure类型。
所现在遇到的挑战其实有两个: 1.如何设法在NodeJs环境下直接与DLL对话的方式,正确传递参数并调用封装在DLL的函数 2.如果设法直接使用NodeJS的读取这几个二进制文件并转义为JSON,做为RESTful API可以直接使用的数据,或者写入mongoDB。
求个大概的思路即可,先谢过。
要实现从 Node.js 调用 Delphi 编写的 DLL 并处理返回的数据,可以遵循以下步骤:
1. 创建 Delphi DLL
假设你有一个 Delphi 函数签名如下:
library MyDelphiLibrary;
uses
SysUtils,
Classes;
type
TMyRecord = record
Value1: Integer;
Value2: Double;
end;
function CalculateData(const input: Integer; var output: TMyRecord): Integer; stdcall;
begin
// 假设这里有一些计算逻辑
output.Value1 := input * 2;
output.Value2 := input / 2.0;
Result := input + output.Value1 + Round(output.Value2);
end;
exports
CalculateData;
begin
end.
2. 使用 Node.js 调用 DLL
Node.js 本身不支持直接调用 DLL,但可以通过 ffi-napi
或 node-ffi
这样的库来实现。
首先安装 ffi-napi
和 ref-napi
:
npm install ffi-napi ref-napi
然后编写 Node.js 脚本:
const ffi = require('ffi-napi');
const ref = require('ref-napi');
// 定义 Delphi Record 的结构
const TMyRecord = new ref.StructType({
Value1: 'int32',
Value2: 'double'
});
// 加载 DLL
const myDll = new ffi.Library('./MyDelphiLibrary.dll', {
'CalculateData': [
'int32', // 返回值类型
['int32', 'pointer'], // 参数类型
]
});
// 创建记录实例
const record = new TMyRecord();
record.Value1 = 0;
record.Value2 = 0.0;
// 调用 DLL 函数
const result = myDll.CalculateData(5, record.ref());
console.log(`Result from DLL: ${result}`);
console.log(`Record after call: Value1=${record.Value1}, Value2=${record.Value2}`);
3. 处理返回的数据
你可以将 Delphi 返回的二进制数据转换为 JSON 格式,以便进一步处理或存储到 MongoDB 中。例如:
const mongoose = require('mongoose');
// 连接 MongoDB
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });
const MySchema = new mongoose.Schema({
value1: Number,
value2: Number
});
const MyModel = mongoose.model('MyModel', MySchema);
async function saveToMongo(record) {
const doc = new MyModel({
value1: record.Value1,
value2: record.Value2
});
await doc.save();
console.log('Saved to MongoDB');
}
saveToMongo(record);
总结
- 创建 Delphi DLL:定义需要导出的函数和数据结构。
- 使用 Node.js 调用 DLL:通过
ffi-napi
库加载并调用 DLL 中的函数。 - 处理返回的数据:将二进制数据转换为 JSON 格式,并保存到 MongoDB 中。
这样,你就可以在 Node.js 环境中调用 Delphi 编写的 DLL,并处理其返回的数据了。
问一下,你们所用到得Delphi是指面向CLR的,在.net平台上运行的那种?
应该不是那种,我们这个项目用的是不带.Net包的Delphi的版本。而且我们这个项目的所有DLL都跟.Net也没啥关系,都是直接在window上运行的,最普通的那种。target platforms最多分一下32位window还是64位window。
nodejs调用的dll 要符合一定格式的。 要再写一个dll调用delphi的dll
这个估计比较麻烦,最好用delphi写一个简单的http服务,然后node去调用。
用socket通讯
要在Node.js环境中调用Delphi编写的DLL,并处理返回的二进制文件,可以按照以下步骤进行:
1. 调用DLL中的函数
首先,你需要通过Node.js的ffi-napi
或node-ffi
库来调用Delphi DLL中的函数。这两个库允许你在Node.js中加载和调用外部动态链接库。
示例代码:
const ffi = require('ffi-napi');
const ref = require('ref-napi');
// 定义Delphi函数的签名
const myDelphiFunction = new ffi.Library('path/to/dll', {
'MyDelphiFunction': ['int32', ['pointer', 'uint32']] // 根据实际情况调整函数签名
});
// 创建一个用于接收结果的缓冲区
let resultBuffer = new Buffer(1024);
let resultSize = 1024;
// 调用Delphi函数
let result = myDelphiFunction.MyDelphiFunction(resultBuffer.ref(), resultSize);
console.log(`Result: ${result}`);
2. 处理二进制文件
调用Delphi DLL后,你可能会得到一个包含二进制数据的缓冲区。你可以将这些二进制数据转换为JSON格式,以便于进一步处理或存储到MongoDB中。
示例代码:
const struct = require('ref-struct-napi'); // 用于定义结构体
// 定义Delphi记录类型的结构
const MyDelphiRecord = struct({
field1: 'uint32',
field2: 'float',
// 其他字段...
});
// 将缓冲区转换为结构体
let record = new MyDelphiRecord();
record.ref().copyFrom(resultBuffer, 0, resultSize);
// 将结构体转换为JSON
let jsonResult = JSON.stringify(record);
console.log(jsonResult);
// 将JSON写入MongoDB
const MongoClient = require('mongodb').MongoClient;
const uri = "your_mongodb_connection_string";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
client.connect(err => {
const collection = client.db("test").collection("records");
collection.insertOne(jsonResult, function(err, res) {
if (err) throw err;
console.log("Document inserted");
client.close();
});
});
总结
以上示例展示了如何使用ffi-napi
和ref-napi
库来调用Delphi DLL中的函数,并将返回的二进制数据转换为JSON格式。这只是一个基本框架,具体实现细节可能需要根据你的DLL的具体功能进行调整。