博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi获取文件版本号
阅读量:6003 次
发布时间:2019-06-20

本文共 3446 字,大约阅读时间需要 11 分钟。

 

{取应用程式的版本号程式,如有版本号,返回值为版本号的值,否则返回值为空

返回值的格式为如1.0.0.0 }

   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;

// ***********************上例在环境中测试过***********************************************/

 

以下程序在DELPHI7 W2003测试通过:

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;
如何用Delphi编程读出一个DLL文件的版本号,请给示例  
好,给几个函数还不行,那就给段代码吧:
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;
如何获取一个可执行文件的版本号?
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;

转载地址:http://pfsmx.baihongyu.com/

你可能感兴趣的文章
使用Eclipse调试Java程序的10个技巧
查看>>
Hive分桶表
查看>>
oracle10g 启动时报错:ORA-32004 ORA-19905
查看>>
思科分发列表过滤路由(RIP)动态路由协议篇
查看>>
可登录的用户数量是1.6万个,软件的性能得到充分的考验
查看>>
[实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表
查看>>
[译] ES2018(ES9)的新特性
查看>>
Javascript基础复习 数据类型
查看>>
C# Selenium 破解腾讯滑动验证
查看>>
bom与dom的区别
查看>>
Matlab2012a下配置LibSVM—3.18
查看>>
Java生成-zipf分布的数据集(自定义倾斜度,用作spark data skew测试)
查看>>
修复CefSharp浏览器组件中文输入Bug
查看>>
正则与sed,grep,awk三剑客
查看>>
诊断一句SQL不走索引的原因
查看>>
iOS开发拓展篇—UIDynamic(简单介绍)
查看>>
Linux pipe函数
查看>>
图片标注工具LabelImg使用教程
查看>>
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (TRDB-LTM) (DE2-70)...
查看>>
/etc/profile文件内容
查看>>