delphi – 使用Build获取FileVersion

delphi – 使用Build获取FileVersion,第1张

概述DelphiXe. 为了接收文件的版本我使用的功能: function FileVersion(AFileName: string): string;var szName: array[0..255] of Char; P: Pointer; Value: Pointer; Len: UINT; GetTranslationString: string; FFileNam DelphiXe.

为了接收文件的版本我使用的功能:

function FiLeversion(Afilename: string): string;var  szname: array[0..255] of Char;  P: Pointer;  Value: Pointer;  Len: UINT;  GetTranslationString: string;  Ffilename: PChar;  FValID: boolean;  FSize: DWORD;  FHandle: DWORD;  FBuffer: PChar;begin  try    Ffilename := StrPcopy(StrAlloc(Length(Afilename) + 1),Afilename);    FValID := False;    FSize := GetFiLeversionInfoSize(Ffilename,FHandle);    if FSize > 0 then    try      GetMem(FBuffer,FSize);      FValID := GetFiLeversionInfo(Ffilename,FHandle,FSize,FBuffer);    except      FValID := False;      raise;    end;    Result := '';    if FValID then      VerqueryValue(FBuffer,'\VarfileInfo\Translation',p,Len)    else      p := nil;    if P <> nil then      GetTranslationString := IntToHex(MakeLong(HiWord(Longint(P^)),LoWord(Longint(P^))),8);    if FValID then    begin      StrPcopy(szname,'\StringfileInfo\' + GetTranslationString +        '\FiLeversion');      if VerqueryValue(FBuffer,szname,Value,Len) then        Result := StrPas(PChar(Value));    end;  finally    try      if FBuffer <> nil then        FreeMem(FBuffer,FSize);    except    end;    try      Strdispose(Ffilename);    except    end;  end;end;

对于大多数执行的文件和库,它返回正确的值.但是在某些文件中,版本被截断并显示没有Build.
这里例如文件BASS.DLL(http://us.un4seen.com/files/bass24.zip)
在windows资源管理器中的文件属性中,我看到版本2.4.7.1,函数result =’2.4.7′:(

我通过ResourceHacker.exe(http://angusj.com/resourceHacker/)打开一个文件,我看结构VersionInfo:

1 VERSIONINFOFILeverSION 2,4,7,1PRODUCTVERSION 2,0fileOS 0x4fileTYPE 0x2{BLOCK "StringfileInfo"{    BLOCK "000004b0"    {        VALUE "Companyname","Un4seen Developments"        VALUE "fileDescription","BASS"        VALUE "FiLeversion","2.4.7"        VALUE "Legalcopyright","copyright © 1999-2010"    }}BLOCK "VarfileInfo"{    VALUE "Translation",0x0000 0x04B0}}

问题:如何收到2.4.7.1,即完整版?

解决方法 如果您想要根块的文件版本,那么请忘记特定于语言的翻译:

function FiLeversion(const filename: Tfilename): String;var  VerInfoSize: Cardinal;  VerValueSize: Cardinal;  Dummy: Cardinal;  PVerInfo: Pointer;  PVerValue: PVSFixedfileInfo;begin  Result := '';  VerInfoSize := GetFiLeversionInfoSize(PChar(filename),Dummy);  GetMem(PVerInfo,VerInfoSize);  try    if GetFiLeversionInfo(PChar(filename),VerInfoSize,PVerInfo) then      if VerqueryValue(PVerInfo,'\',Pointer(PVerValue),VerValueSize) then        with PVerValue^ do          Result := Format('v%d.%d.%d build %d',[            HiWord(DWFiLeversionMS),//Major            LoWord(DWFiLeversionMS),//Minor            HiWord(DWFiLeversionLS),//Release            LoWord(DWFiLeversionLS)]); //Build  finally    FreeMem(PVerInfo,VerInfoSize);  end;end;
总结

以上是内存溢出为你收集整理的delphi – 使用Build获取FileVersion全部内容,希望文章能够帮你解决delphi – 使用Build获取FileVersion所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1268896.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存