在软件自动升级软件中,需要对服务器上的文件进行比较,决定是否需要升级,据说可以通过设定软件的版本,对版本进行比较,不知怎么搞。

解决方案 »

  1.   


    //获得文件版本信息
    procedure TForm1.Button1Click(Sender: TObject);
    const
    InfoNum = 9;
    InfoStr: array[1..InfoNum] of string = (
       'ProductName',
       'ProductVersion',
       'FileDescription',
       'LegalCopyright',
       'FileVersion',
       'CompanyName',
       'LegalTradeMarks',
       'InternalName',
       'OriginalFileName'
       );
    var
       S: string;
       BufSize, Len: DWORD;
       Buf: PChar;
       Value: PChar;
    begin
       S := Application.ExeName;
       BufSize := GetFileVersionInfoSize(PChar(S), BufSize);
       if BufSize > 0 then
       begin
         Buf := AllocMem(BufSize);
         GetFileVersionInfo(PChar(S), 0, BufSize, Buf);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value), Len) then
           Memo1.Lines.Add (Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
           Memo1.Lines.Add ( '产品版本: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
           Memo1.Lines.Add ('文件说明: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
           Memo1.Lines.Add ('合法版权: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
           Memo1.Lines.Add ('文件版本: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
           Memo1.Lines.Add ('公司名称: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
           Memo1.Lines.Add ('合法商标: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
           Memo1.Lines.Add ('内部名称: ' + Value);
         if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
           Memo1.Lines.Add ('原文件名: ' + Value);
         FreeMem(Buf, BufSize);
       end
       else
       begin
         Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
         Application.Terminate;
       end;
    end; 
      

  2.   

    给你两个函数,比较文件的大小和版本就可以了.pFileName要完整路径,第一个函数取出来的单位为byte,
    获取本机的和服务器比较.function GetFileSizeString(pFileName: String):String;
    var
      FileHandle: integer;
    begin
      Result := '';
      FileHandle := FileOpen(pFileName, 0);
      Result := IntToStr(FileSeek(FileHandle, 0, 2));
      FileClose(FileHandle);
    end;function GetVersionString(pFileName: string): string;
    var
      VerInfoSize: DWORD;
      VerInfo: Pointer;
      VerValueSize: DWORD;
      Dummy: DWORD;
      VerValue: PVSFixedFileInfo;
    begin
      Result := '0';
      VerInfoSize := GetFileVersionInfoSize(PChar(pFileName), Dummy);
      if VerInfoSize = 0 then
        Exit;
      GetMem(VerInfo, VerInfoSize);
      GetFileVersionInfo(PChar(pFileName), 0, VerInfoSize, VerInfo);
      VerQueryValue(VerInfo, chr(92), Pointer(VerValue), VerValueSize);
      Result := IntToStr(VerValue^.dwFileVersionMS shr 16) + '.' +
        IntToStr(VerValue^.dwFileVersionMS and $FFFF) + '.' +
        IntToStr(VerValue^.dwFileVersionLS shr 16) + '.' +
        IntToStr(VerValue^.dwFileVersionLS and $FFFF);
      FreeMem(VerInfo);
    end;
      

  3.   

    可以弄一个 .txt 文件放版本
      

  4.   

    如果文件的版本信息不全就不起作用了。
    循环读一定大小到内存,直接比较内存也可以。for i := 1 to Cnt do
    begin
      Application.ProcessMessages;
      FS1.Read(Buff1^, n_BlockSize);
      FS2.Read(Buff2^, n_BlockSize);
      Result := CompareMem(Buff1, Buff2, n_BlockSize);          
      if not Result then Exit;
    end;
      

  5.   

    GetFileVersionInfoSize(PChar(S), BufSize);是一个API函数?怎样将文件(exe或dll)的版本信息写进文件?