热情软件屋

 

如何获取文件版本


编号:QA002570
建立日期: 2000年2月14日 最后修改日期:2000年2月14日
所属类别:

jhzhao:
    编程工具: delphi4
    操作系统: windows9x
    近日在学习Delphi4时想使用API实现获取文件版本,但获取的版本总是不对,望予以解答。附:
     Var
     FullFileName : String;
     lBufferLen : DWORD;
     udtVerBuffer : VS_FIXEDFILEINFO;
     lVerbufferLen : DWORD;
     lVerPointer : Pointer;
     lBufferPointer : Pointer;
     lDummy : DWORD;
     FileVersionMSl,FileVersionMSh,FileVersionLSl,FileVersionLSh : String;
     begin
     FullFileName:='C:\windows\Explorer.exe'; //版本号为:4.72.3110.1
     lBufferLen:=GetFileVersionInfoSize(Pchar(FullFileName),lDummy);
     If lBufferLen > 0 then
     Begin
     lBufferPointer:=nil; //不写此句即报错
     GetFileVersionInfo(Pchar(FullFileName),$0,lBufferLen,lBufferPointer);
     //此时lBufferPointer仍然为nil,可能错误在这里
     VerQueryValue(lBufferPointer,'\',lVerPointer,lDummy);
     MoveMemory(Addr(udtVerBuffer), lVerPointer, sizeof(udtVerBuffer));
     FileVersionMSh:= Inttostr(hi(udtVerBuffer.dwProductVersionMS));
     FileVersionMSl:= Inttostr(lo(udtVerBuffer.dwProductVersionMS));
     FileVersionLSh:= Inttostr(hi(udtVerBuffer.dwProductVersionLS));
     FileVersionLSl:= Inttostr(hi(udtVerBuffer.dwProductVersionLS));
     label1.caption:=FileVersionMSh+'.'+FileVersionMSl+'.'+FileVersionLSh+'.'+FileVersionLSl;
     //此处为:101.103.101.101
     End;
     end;
    
    

回答:

    正如你所估计的,lBufferPointer是主要的错误。在调用GetFileVersionInfo之前,你必须分配一个缓冲区获得函数返回的版本信息。所以指定lBufferPointer为nil而没有传递缓冲区地址就无法获得版本信息。下面是一个正确的例子,你可以参考然后对你的程序进行修改:
    procedure TForm1.Button1Click(Sender: TObject);
    const
     InfoNum = 10;
     InfoStr : array [1..InfoNum] of String =
     ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName',
     'LegalCopyright', 'LegalTradeMarks', 'OriginalFilename',
     'ProductName', 'ProductVersion', 'Comments');
    var
     S : String;
     n, Len, i : Integer;
     Buf : PChar;
     Value : PChar;
    begin
     S := Application.ExeName;
     n := GetFileVersionInfoSize(PChar(S),n);
     if n > 0 then begin
     Buf := AllocMem(n);
     Memo1.Lines.Add('FileVersionInfoSize='+IntToStr(n));
     GetFileVersionInfo(PChar(S),0,n,Buf);
     for i:=1 to InfoNum do
     if VerQueryValue(Buf,PChar('StringFileInfo\040904E4\'+
     InfoStr[i]),Pointer(Value),Len) then
     Memo1.Lines.Add(InfoStr[i]+'='+Value);
     FreeMem(Buf,n);
     end else
     Memo1.Lines.Add('No FileVersionInfo found');
    end;
    
    相关问题:
    QA001908 "如何获取文件的版本信息"

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio