公司的业务需要,nodejs要读取文件版本号。

同事要求我用delphi编写dll,以供nodejs调用,结果通过json返回。

delphi代码如下:

 function GetFileInfo(APath: PAnsiChar): PAnsiChar;
var
sPath: string;
FInfoSize, Temp, Len: Cardinal;
InfoBuf: Pointer;
TranslationLength: Cardinal;
TranslationTable: Pointer;
LanguageID, CodePage, LookupString: String;
Value: PChar;
vJ: ISuperObject;
begin
sPath := Utf8ToAnsi(strPas(APath));
FInfoSize := GetFileVersionInfoSize(PChar(sPath), Temp);
vJ := SO;
if FInfoSize > then
begin
InfoBuf := AllocMem(FInfoSize);
try // try
GetFileVersionInfo(PChar(sPath), , FInfoSize, InfoBuf); if VerQueryValue( InfoBuf, '\VarFileInfo\Translation', TranslationTable, TranslationLength ) then
begin
CodePage := Format( '%.4x', [ HiWord( PLongInt( TranslationTable )^ ) ] );
LanguageID := Format( '%.4x', [ LoWord( PLongInt( TranslationTable )^ ) ] );
end;
LookupString := 'StringFileInfo\' + LanguageID + CodePage + '\'; if VerQueryValue( InfoBuf, PChar( LookupString + 'CompanyName' ), Pointer( Value ), Len ) then
vJ.S['CompanyName'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'FileDescription' ), Pointer( Value ), Len ) then
vJ.S['FileDescription'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'FileVersion' ), Pointer( Value ), Len ) then
vJ.S['FileVersion'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'InternalName' ), Pointer( Value ), Len ) then
vJ.S['InternalName'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'LegalCopyright' ), Pointer( Value ), Len ) then
vJ.S['LegalCopyright'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'LegalTrademarks' ), Pointer( Value ), Len ) then
vJ.S['LegalTrademarks'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'OriginalFilename' ), Pointer( Value ), Len ) then
vJ.S['OriginalFilename'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'ProductName' ), Pointer( Value ), Len ) then
vJ.S['ProductName'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'ProductVersion' ), Pointer( Value ), Len ) then
vJ.S['ProductVersion'] := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'Comments' ), Pointer( Value ), Len ) then
vJ.S['Comments'] := Value;
finally // wrap up finally
FreeMem(InfoBuf, FInfoSize);
end; // end try finally
end;
Result := PAnsiChar(AnsiString(vJ.AsJSon));
end;

PS:

1. 用到的字符串可能较长,注意调用ShareMem

2. 所有的string类型都需要定义成PAnsiChar

3. 此处nodejs使用的编码是utf8,需要转码

4. 返回值,需先通过AnsiString转换,再转换PAnsiChar,不然只能读取到第一个字符

nodejs测试代码如下:

 var ffi = require('ffi');

 try {
var demo = ffi.Library('./fileInfo', {
'GetFileInfo': [ 'string', ['string'] ],
}); console.log(demo);
const info = demo.GetFileInfo('C:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe');
console.log(JSON.parse(info));
console.log('End Test');
} catch(err) {
console.log(err);
}

测试结果如下:

nodejs调用delphi编写的dll的更多相关文章

  1. C# 调用delphi编写的dll

    技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...

  2. [JNA系列]Java调用Delphi编写的Dll之JNA使用

    介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...

  3. [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar

    Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...

  4. [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar

    Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...

  5. Go调用Delphi编写的DLL

    参数整数没有问题,但是如果是字符串,要注意几个细节. 记录如下: 1.Delphi定义函数的时候,字符串参数需要使用PChar类型 2.Go传递参数的时候要将字符串转成UTF16的指针,接收的时候采用 ...

  6. [JNA系列]Java调用Delphi编写的Dll之Delphi与JAVA基本数据类型对比

    Delphi与JAVA基本数据类型对比 类型 Delphi关键字 JAVA关键字 字节 备注 范围 整型 Shortint byte 1 有符号8位 -128..127 Byte 1 无符号8位 0 ...

  7. 分享一次C#调用Delphi编写Dll程序

    1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...

  8. C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)

        C#调用C++编写的DLL函数, 以及各种类型的参数传递 1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int ...

  9. C#动态调用C++编写的DLL函数

    C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...

随机推荐

  1. linux 4 -awk

    十一.  awk编程:     1.  变量:     在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&q ...

  2. python基础13 ---函数模块3(正则表达式)

    正则表达式 一.正则表达式的本质 1.正则表达式的本质(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的 ...

  3. Yii2 关于电子商务的开源项目

    https://github.com/samdark/yii2-shop https://github.com/omnilight/yii2-shopping-cart https://github. ...

  4. PHP保存数组到文件中的方法

    ThinkPHP自3.1以后的版本,F函数保存数组时先序列化后再保存到文件中,因为我需要使用C方法来读取自定义配置文件,故需要把PHP数组保存到文件中以便C方法读取,PHP保存数组到文件的方法如下: ...

  5. action extension添加图标

    最近在做ios的action extension,这里记录一下添加图标的方法. 在Action Extension的target里面的Build Settings,里面的Asset Catalog C ...

  6. Effective java -- 9 并发/序列化

    关于同步的问题,想弄明白java,同步不会是不行的.这不书弄完后还会从<java并发编程实战>和<java并发编程的艺术>选一本或者都看. 第六十六条:同步访问共享的可变数据说 ...

  7. hadoop-2.0.0-cdh4.6.0、sqoop-1.4.3-cdh4.6.0、mahout-0.7-cdh4.6.0 安装笔记

    1. /etc/profile中环境变量配置: export HADOOP_HOME=/usr/local/hadoop/cdh4. export HADOOP_MAPRED_HOME=${HADOO ...

  8. Windows默认字符集_查询

    https://zhidao.baidu.com/question/32462047.html Windows95. XP……7操作系统自带的都是GBK字符集(含2万余汉字),是完全兼容GB2312( ...

  9. DBGrideh 实现自动排序

    一.点击标题自动排序 1.在optioneh中设置:AutosortMarking:=True2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)sortlocal:=True;3 ...

  10. .net Core 相关问题

    1.Vs中注释生成xml文档文件 项目->属性->生成->输出->勾选“XML文档文件”->保存  就完成. 保存后出现没有勾选情况,直接用txt打开.csproj文件加 ...