nodejs调用delphi编写的dll
公司的业务需要,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的更多相关文章
- C# 调用delphi编写的dll
技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...
- [JNA系列]Java调用Delphi编写的Dll之JNA使用
介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...
- Go调用Delphi编写的DLL
参数整数没有问题,但是如果是字符串,要注意几个细节. 记录如下: 1.Delphi定义函数的时候,字符串参数需要使用PChar类型 2.Go传递参数的时候要将字符串转成UTF16的指针,接收的时候采用 ...
- [JNA系列]Java调用Delphi编写的Dll之Delphi与JAVA基本数据类型对比
Delphi与JAVA基本数据类型对比 类型 Delphi关键字 JAVA关键字 字节 备注 范围 整型 Shortint byte 1 有符号8位 -128..127 Byte 1 无符号8位 0 ...
- 分享一次C#调用Delphi编写Dll程序
1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...
- C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)
C#调用C++编写的DLL函数, 以及各种类型的参数传递 1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int ...
- C#动态调用C++编写的DLL函数
C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...
随机推荐
- host更新
http://alsohosts.herokuapp.com/ google镜像站https://goge.ml/
- matlab 代码加速
~ 使用 parfor 代替 for 1. 安装 Parallel Computing Toolbox, 使用 parfor代替for, 使用的是cpu多核,速度能提高三倍左右. ~ 在for循环中的 ...
- python3 批量缩放图片为iphone5的640*1136以下
try: from PIL import Image, ImageDraw, ImageFont, ImageEnhance except ImportError: import Image, Ima ...
- iOS 发大招 otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 写法 && 编写通用类的时候关于可变参数的处理
开始 我 以为 这个 alertView 里面 ...的写法 应该 是一个 普通的数组 然 并没有 分享一篇好文 http://www.tekuba.net/program/290/ IOS实现 ...
- Excel 2007中自定义数字格式前要了解的准则
要在Excel 2007中创建自定义数字格式,首先应了解自定义数字格式的准则,并从选择某一内置数字格式开始.然后,可以更改该格式的任意代码部分,从而创建自己的自定义数字格式. 数字格式最多可包含四个代 ...
- GetTickCount的几个案例
一,获得运行时间: var T1,T2 : double; begin T1 := GetTickCount; //需要做的事情 T2 := GetTickCount; ShowMessage( fl ...
- Spring Cloud之DiscoveryClient使用
主要修改zk order的代码: package com.toov5.api.controller; import java.util.List; import org.springframework ...
- Java 动态代理机制分析及扩展,第 1 部分
Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...
- ffmpeg 获取视频宽高
int main(int argc, char *argv[]) { const char* file_name = "video.mp4"; int ret; unsigned ...
- $().bind()的返回值
var eleMenus = $("#choMenu a").bind("click", function (event){}); 此时eleMeuns的值是$ ...