求教一个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。

求个大概的思路即可,先谢过。


7 回复

要实现从 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-napinode-ffi 这样的库来实现。

首先安装 ffi-napiref-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);

总结

  1. 创建 Delphi DLL:定义需要导出的函数和数据结构。
  2. 使用 Node.js 调用 DLL:通过 ffi-napi 库加载并调用 DLL 中的函数。
  3. 处理返回的数据:将二进制数据转换为 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-napinode-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-napiref-napi库来调用Delphi DLL中的函数,并将返回的二进制数据转换为JSON格式。这只是一个基本框架,具体实现细节可能需要根据你的DLL的具体功能进行调整。

回到顶部