我用Delphi7做了一个Assist.exe,我在Project->Options里面设置了发布的版本号,我能否在这个程序内部获取自己的版本号,从而判断是否旧版本?

解决方案 »

  1.   


    function GetVersionCheck(FileDir: string): string;
    var
       Dlen:Dword;
       Dsize:Dword;
       PDatA:pointer;
       block:^VS_FIXEDFILEINFO ;
    begin
       DLen:=GetFileVersioninfoSize(Pchar(filedir),Dsize);
       if DLen<>0 then
       begin
          GetMem(Pdata,Dlen);
          try
             if GetFileVersionInfo(pchar(FileDir),Dsize,Dlen,Pdata) then
             begin
               Block:=nil;
               VerQueryValue(pdata,'\',pointer(Block),dsize);
               if Block<>nil then
               begin
                  Result:=Format('%d.%d.%d.%d',[Block^.dwFileVersionMS shr 16,
                                                                 block^.dwFileVersionMS and $0000ffff,
                                                                 block^.dwFileVersionLS shr 16,
                                                                 block^.dwFileVersionLS and $0000ffff]);           end;
             end;
          FINALLY
             freemem(pdata,DLEN);
          end;
       end;
    end;
      

  2.   

     function   FileVersion(FileName:   String):string;   
      var   
          InfoSize,   unuse:   DWORD;   
          VerBuf:   Pointer;   
          FI:   PVSFixedFileInfo;   
          VerSize:   DWORD;   
          MajorMinor,ReleaseBuild   :DWORD;   
      begin   
          unuse   :=0;   
          MajorMinor   :=   0;//Major,Minor   如:00010001代表1.1   
          ReleaseBuild   :=   0;//Release,Build   如00121208代表12.1208   则版本为1.1.12.1208   
          result   :='unknown';   
          InfoSize   :=   GetFileVersionInfoSize(PChar(FileName),   unuse);   
          if   InfoSize   <>   0   then   
          begin   
              GetMem(VerBuf,   InfoSize);   
              try   
                  if   GetFileVersionInfo(PChar(FileName),   unuse,   InfoSize,   VerBuf)   then   
                      if   VerQueryValue(VerBuf,   '\',   Pointer(FI),   VerSize)   then   
                      begin   
                          MajorMinor   :=   FI.dwFileVersionMS;   
                          ReleaseBuild   :=   FI.dwFileVersionLS;   
                      end;   
              finally   
                  FreeMem(VerBuf);   
              end;   
              result   :=IntToStr(MajorMinor   shr   16)   +   '.'   +   IntToStr(MajorMinor   and   $ffff)   +   '.'   +   IntToStr(ReleaseBuild   shr   16)   +   '.'   +   IntToStr(ReleaseBuild   and   $ffff);   
          end;   
      end;   
      

  3.   

    procedure UnixTime_2_FileTime (const time_in:DWORD ; const pft:PFILETIME);inline;
    var
      X:Int64;
    begin
      x := LongLong(time_in) * 10000000 + 116444736000000000;//$19db1ded53ea710;
      pft^.dwHighDateTime := DWORD((x shr 32) and $0ffffffff);
      pft^.dwLowDateTime := DWORD(x and $0ffffffff);
    end;function UinxTime_2_FileTime_String(const time_in:DWORD):String;inline;
    var
      ft:FILETIME;
      st:SYSTEMTIME;
    begin
      UnixTime_2_FileTime(time_in,@ft);
      FileTimeToLocalFileTime(ft,ft);
      FileTimeToSystemTime(ft,st);
      result := FormatDateTime(' (yyyy.mm.dd hh:nn:ss)',SystemTimeToDateTime(st));end;
    function GetVersion: string;
    var
      VerInfoSize: DWORD;
      VerInfo: Pointer;
      VerValueSize: DWORD;
      VerValue: PVSFixedFileInfo;
      Dummy: DWORD;
    begin
      Result := '0.0.0.0';  VerInfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), Dummy);
      GetMem(VerInfo, VerInfoSize);
      GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
      VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
      with VerValue^ do
      begin
        dwProductVersionMS := dwFileVersionMS;
        dwProductVersionLS := dwFileVersionLS;
        Result :=Format('%d.%d.%d.%d', [
          dwProductVersionMS shr 16,
          dwProductVersionMS and $FFFF,
          dwProductVersionLS shr 16,
          dwProductVersionLS and $FFFF
          ]);
      end;
    end;
    function TFrmAbout.GetFileDate(FileName: String;var FileDate:String): Boolean;
    type  _IMAGE_RESOURCE_DIRECTORY = record
        Characteristics: DWORD;
        TimeDateStamp: DWORD;
        MajorVersion: WORD;
        MinorVersion: WORD;
        NumberOfNamedEntries :WORD;
        NumberOfIdEntries: WORD;
    //  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
      end;
      IMAGE_RESOURCE_DIRECTORY = _IMAGE_RESOURCE_DIRECTORY;
      TIMAGERESOURCEDIRECTORY = _IMAGE_RESOURCE_DIRECTORY;
      PIMAGE_RESOURCE_DIRECTORY = ^IMAGE_RESOURCE_DIRECTORY;
      PIMAGERESOURCEDIRECTORY = ^TIMAGERESOURCEDIRECTORY;  _IRDE_NAME = record
        case Integer of
          0:
            //struct {
            //    DWORD NameOffset:31;
            //    DWORD NameIsString:1;
            // };
            (NameOffset: DWORD);
          1:  (Name: DWORD);
          2:  (Id: Word);
        end;
      _IRDE_OFFSET_DATA = record
          case Integer of        0:(OffsetToData: DWORD);
            //struct {
            //    DWORD   OffsetToDirectory:31;
            //    DWORD   DataIsDirectory:1;
            //};
            1:(Directory: DWORD);
        end;
      _IMAGE_RESOURCE_DIRECTORY_ENTRY = record
        IRDE_NAME: _IRDE_NAME;
        IRDE_OFFSET_DATA: _IRDE_OFFSET_DATA;
      end;
      IMAGE_RESOURCE_DIRECTORY_ENTRY = _IMAGE_RESOURCE_DIRECTORY_ENTRY;
      PIMAGE_RESOURCE_DIRECTORY_ENTRY = ^IMAGE_RESOURCE_DIRECTORY_ENTRY;
      TIMAGERESOURCEDIRECTORYENTRY = IMAGE_RESOURCE_DIRECTORY_ENTRY;
      PIMAGERESOURCEDIRECTORYENTRY = TIMAGERESOURCEDIRECTORYENTRY;
    const
      INVALID_SET_FILE_POINTER = DWORD(-1);
    var
      hFileSource: THandle;
      dwSourceSize, byte_write: Cardinal;
      pFileSource: PChar;  dosHeadA: PImageDosHeader;
      ntHeadA: PIMAGENTHEADERS ;
    begin
        Result := false;
        //打开文件
        hFileSource := CreateFile(  PChar(FileName),
                                          GENERIC_READ,
                                          FILE_SHARE_READ ,
                                          Nil,
                                          OPEN_EXISTING,
                                          FILE_ATTRIBUTE_ARCHIVE or
                                          FILE_ATTRIBUTE_HIDDEN or
                                          FILE_ATTRIBUTE_NORMAL or
                                          FILE_ATTRIBUTE_SYSTEM,
                                          0
                                         );    if (hFileSource = INVALID_HANDLE_VALUE) then begin
            Exit;
        end;
        dwSourceSize := GetFileSize(hFileSource,Nil);
        if (dwSourceSize = INVALID_FILE_SIZE) then begin
            CloseHandle(hFileSource);
            exit;
        end;    byte_write := 0;
        //讀取
        pFileSource := HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,dwSourceSize);
        if (pFileSource = Nil) then begin
            CloseHandle(hFileSource);
            Exit;
        end;
        if (INVALID_SET_FILE_POINTER = SetFilePointer(hFileSource,0,NIL,FILE_BEGIN)) then begin
            HeapFree(GetProcessHeap,0, pFileSource);
            CloseHandle(hFileSource);
            Exit;
        end;
        if(Not ReadFile( hFileSource, pFileSource^,dwSourceSize,byte_write,Nil)) then begin
            HeapFree(GetProcessHeap,0, pFileSource);
            CloseHandle(hFileSource);
            Exit;
        end;
        if (StrLIComp( pFileSource,'MZ',2)<>0) then begin
            HeapFree(GetProcessHeap,0, pFileSource);
            CloseHandle(hFileSource);
            Exit;
        end;    dosHeadA :=PImageDosHeader(pFileSource); //DOS Header    ntHeadA := PIMAGENTHEADERS (PChar(Cardinal(pFileSource) + Cardinal( dosHeadA^._lfanew))); //NT Header
        if (ntHeadA^.Signature <> $4550) then begin
            HeapFree(GetProcessHeap,0, pFileSource);
            CloseHandle(hFileSource);
            Exit;
        end;    FileDate := UinxTime_2_FileTime_String(ntHeadA^.FileHeader.TimeDateStamp);
        Result := true;
        CloseHandle(hFileSource);
        HeapFree(GetProcessHeap,0, pFileSource);
    end;version.Caption := 'Version:' +  GetVersion + Filedate;