Delphi获取指定文件的版本号
获取指定文件的版本号
方式一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | function GetFileVersion(FileName: string ): string ; type PVerInfo = ^TVS_FIXEDFILEINFO; TVS_FIXEDFILEINFO = record dwSignature: longint ; dwStrucVersion: longint ; dwFileVersionMS: longint ; dwFileVersionLS: longint ; dwFileFlagsMask: longint ; dwFileFlags: longint ; dwFileOS: longint ; dwFileType: longint ; dwFileSubtype: longint ; dwFileDateMS: longint ; dwFileDateLS: longint ; end ; var ExeNames: array [ 0..255 ] of char ; zKeyPath: array [ 0..255 ] of Char ; VerInfo: PVerInfo; Buf: pointer ; Sz: word ; L, Len: Cardinal ; begin StrPCopy(ExeNames, FileName); Sz := GetFileVersionInfoSize(ExeNames, L); if Sz= 0 then begin Result:= '' ; Exit; end ; try GetMem(Buf, Sz); try GetFileVersionInfo(ExeNames, 0 , Sz, Buf); if VerQueryValue(Buf, '\', Pointer (VerInfo), Len) then begin Result := IntToStr(HIWORD(VerInfo . dwFileVersionMS)) + '.' + IntToStr(LOWORD(VerInfo . dwFileVersionMS)) + '.' + IntToStr(HIWORD(VerInfo . dwFileVersionLS)) + '.' + IntToStr(LOWORD(VerInfo . dwFileVersionLS)); end ; finally FreeMem(Buf); end ; except Result := '-1' ; end ; end ; |
方式二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function GetFileVersion(AFileName: string ): string ; var n, Len: DWORD; Buf : PChar ; Value: Pointer ; szName: array [ 0..255 ] of Char ; Transstring: string ; begin Len := GetFileVersionInfoSize( PChar (AFileName), n); if Len > 0 then begin Buf := AllocMem(Len); if GetFileVersionInfo( Pchar (AFileName), n, Len, Buf) then begin Value := nil ; VerQueryValue(Buf, '\VarFileInfo\Translation' , Value, Len); if Value <> nil then Transstring := IntToHex(MakeLong(HiWord( LongInt (Value^)), LoWord( LongInt (Value^))), 8 ); StrPCopy(szName, '\stringFileInfo\' + Transstring + ' \FileVersion'); if VerQueryValue(Buf, szName, Value, Len) then Result := StrPas( Pchar (Value)); end ; FreeMem(Buf, n); end ; end ; |
按钮 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | procedure TForm1 . Button1Click(Sender: TObject); var dwVerInfoSize, dwVerHnd: DWORD; hMem: THandle; lpvMem, lszVer: Pointer ; szGetName: array [ 0..255 ] of Char ; cchVer: UINT; fRet: Boolean ; vsffi: VS_FIXEDFILEINFO; begin dwVerInfoSize := GetFileVersionInfoSize( 'Shell32.dll' , dwVerHnd); if Boolean (dwVerInfoSize) then begin hMem := GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize); lpvMem := GlobalLock(hMem); GetFileVersionInfo( 'Shell32.dll' , dwVerHnd, dwVerInfoSize, lpvMem); StrCopy(szGetName, '\'); lszVer := nil ; fRet := VerQueryValue(lpvMem, szGetName, lszVer, cchVer); if fRet and Boolean (cchVer) and Boolean (lszVer) then begin vsffi := VS_FIXEDFILEINFO(lszVer^); ShowMessage( '文件版本: ' + IntToStr(HIWORD(vsffi . dwFileVersionMS)) + '.' + IntToStr(LOWORD(vsffi . dwFileVersionMS)) + '.' + IntToStr(HIWORD(vsffi . dwFileVersionLS)) + '.' + IntToStr(LOWORD(vsffi . dwFileVersionLS))); end ; GlobalUnlock(hMem); GlobalFree(hMem); end ; end ; |
方式3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | function GetFileVersion(fn: string ; var ma, mi, r ,b: integer ): boolean ; //得到本程序的版本号 var buf, p: pChar ; sver: ^VS_FIXEDFILEINFO ; i: LongWord ; begin i:= GetFileVersionInfoSize( pchar (fn), i); new(sver); p:= pchar (sver); GetMem(buf, i); ZeroMemory(buf, i); result:= false ; if GetFileVersionInfo( pchar (fn), 0 , 4096 , pointer (buf)) then if VerQueryValue(buf, '\', pointer (sver), i) then begin ma:= sVer^.dwFileVersionMS shr 16 ; mi:= sver^.dwFileVersionMS and $0000ffff ; r:= sver^.dwFileVersionLS shr 16 ; b:= sver^.dwFileVersionLS and $0000ffff ; result:= true ; end ; Dispose(p); FreeMem(buf); end ; |
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
分类:
Delphi 文件/目录
标签:
Delphi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报