公司的业务需要,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);
}

测试结果如下:

最新文章

  1. 5.6---交换整数的奇数位和偶数位(CC150)
  2. 链表操作,空间复杂度要求为O(1)
  3. Trimmomatic安装与使用
  4. 用hibernate自动创建mysql表,添加失败org.hibernate.exception.SQLGrammarException
  5. int21 h
  6. bug fix: openstack can not run swift for pyeclib and liberasurecode do not match
  7. 转:C++中多态是怎样实现的?
  8. PhpStorm创建Drupal模块项目开发教程(4)
  9. Servlet程序开发-- Servlet生命周期
  10. HTML学习笔记 css定位浮动及瀑布流案例 第十三节 (原创) 参考使用表
  11. LeetCode - 596. Classes More Than 5 Students
  12. c++代码的编译
  13. k8s数据管理(八)--技术流ken
  14. 金融量化分析【day112】:量化平台的使用-初始化函数
  15. 深入浅出mybatis之启动详解
  16. echarts map地图设置外边框或者阴影
  17. request接受表单数据中文乱码问题分析
  18. CSS同时选择器
  19. yum安装报错:Failure when receiving data from the peer
  20. 从Iris数据集开始---机器学习入门

热门文章

  1. linux 11 -- mount,umount
  2. 阿里云CentOS7安装Docker
  3. LeetCode:加油站【134】
  4. UI组件之Label
  5. C#仿QQ设置界面导航
  6. crond
  7. CSS: iPhone Custom CSS
  8. python3 字符串属性(一)
  9. 代码题(2)— 统计所有小于非负整数 n 的质数的数量
  10. 2018.5.29 从layout 到 PCBA