为了接收文件的版本我使用的功能:
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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)