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;

posted @ 2012-08-23 11:38  马儿快跑  阅读(6595)  评论(0编辑  收藏  举报