delphi 取文件版本号

{取应用程式的版本号程式,如有版本号,返回值为版本号的值,否则返回值为空 
返回值的格式为如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; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值