在delphi中有一个选项(include version information in project),可以自动产生编译程序的版本号,那位大侠知道如何读取该版本号,最好能提供一些源代码?

解决方案 »

  1.   

    我写的一个过程,你可以瞧瞧试试看。procedure GetSoftVersionInfo(SoftFileName:String;InfoKeyList:String;
      VersionInfoList:TStringList);
    var
      Fn,TransLationStr,VersionKeyName :String;
      AllVersionInfoSize,lpdwHandle,VersionInfoSize :Cardinal;
      PAllVersionInfo,PVersionInfo :Pointer;
      VersionKeyNameList :TStringList;
      InfoKeyIndex :Integer;
    begin
    {-----------------------------------------------------------------------------
      过  程:      GetSoftVersionInfo
      作  者:      蔡建荣
      日  期:      2002年11月21日 星期四
      参  数:
             入口参数:
             ------------------------
                   SoftFileName为所要获取版本信息的文件,为空则默认为当前程序。
                   KeyInfoList 为所要获取指定何种信息,各类型以';'隔开,不包括引号。
             出口参数:
             ------------------------
                   VersionInfoList 为所获取的版本信息。
      返回值:      文件版本信息
      备  注:  --------------------------
          使用到的API如下:      *获取文件版本信息的大小;
          function GetFileVersionInfoSize(lptstrFilename:PChar;
            var lpdwHandle:Cardinal):Cardinal;
          **lptstrFilename所要获取版本信息的文件名;
            lpdwHandle    则为函数需要赋值0的变量;
            函数返回值:   当函数执行成功时,函数返回的为文件版本信息的大小,
                当函数执行失败,返回0;      *获取文件版本信息;
          function GetFileVersionInfo(lptstrFilename:PChar;dwHandle:Cardinal;
            dwLen:Cardinal;lpData:Pointer):Boolean
            lptstrFilename同上
            dwHandle      该变量可忽略
            dwLen         指定接收版本信息的缓存的大小
            lpData        指向版本信息的指针      *从文件版本信息中取对应的值
          function VerQueryValue(pBlock:Pointer;lpSubBlock:PChar;
            var lplpBuffer:Pointer;var puLen :Cardinal):Boolean;
          **pBlock        即由GetFileVersionInfo函数中取得的lpData
            lpSubBlock    指定要取得的版本信息的哪种信息
            
              可取如下三种形式的值
                '\','\VarFileInfo\Translation',
                '\StringFileInfo\lang-charset\string-name'
              版本信息一般有如下几种
                CompanyName FileDescription FileVersion InternalName LegalCopyright
                OriginalFilename ProductName ProductVersion        lplpBuffer    指定用于接收取得的版本信息的缓冲
            puLen         指定用于接收取得的版本信息的缓冲的大小
      -------------------------------------------------------------------------------------------------------}
      { 初始化所要获取的文件路径 }
      if SoftFileName='' then Fn :=Application.ExeName
      else Fn :=SoftFileName;  { 初始化所要获取的版本信息的类型 }
      VersionKeyNameList :=TStringList.Create();
      VersionKeyNameList.Text :=StringReplace(InfoKeyList,';',#13#10,[rfReplaceAll]);  AllVersionInfoSize :=GetFileVersionInfoSize(PChar(Fn),lpdwHandle);
      if AllVersionInfoSize>0 then
      { 若执行成功,则开始取版本信息 }
      begin
        GetMem(PAllVersionInfo,AllVersionInfoSize);
        if GetFileVersionInfo(PChar(Fn),lpdwHandle,AllVersionInfoSize,
           PAllVersionInfo) then
        { 若取版本信息成功,则开始分离版本信息 }
        begin
          { 指针赋值之前,需事先分配内存,若不知大小可指向空指针 }
          PVersionInfo :=nil;
          { 取文件版本信息的所在 }
          VerQueryValue(PAllVersionInfo,'\VarFileInfo\Translation',PVersionInfo,
            VersionInfoSize);
          if PVersionInfo <> nil then
          begin
            TransLationStr :=IntToHex(MakeLong(HiWord(Longint(PVersionInfo^)),
              LoWord(Longint(PVersionInfo^))), 8);
          end;      { 取文件版本信息中的指定信息 }
          for InfoKeyIndex :=0 to VersionKeyNameList.Count-1 do
          begin
            VersionKeyName :=VersionKeyNameList[InfoKeyIndex];
            {
             CompanyName FileDescription FileVersion InternalName LegalCopyright
             OriginalFilename ProductName ProductVersion
            }
            if VersionKeyName <>'' then
            begin
              if VerQueryValue(PAllVersionInfo,PChar('\StringFileInfo\'+
                TransLationStr+'\'+VersionKeyName),PVersionInfo,VersionInfoSize)
              then
              begin
                VersionInfoList.Add(String(PChar(PVersionInfo)));
              end
              else
              begin
                VersionInfoList.Add('');
              end;
            end;
          end;
        end;
        FreeMem(PAllVersionInfo);
      end;
      VersionKeyNameList.Free();
    end;
    可这样子调用
    var
      VersionInfoList :TStringList;
    begin
      VersionInfoList :=TStringList.Create();
      GetSoftVersionInfo('','FileVersion',VersionInfoList);
      EDMsg.Text :='本程序文件当前版本:'+VersionInfoList[0];
      VersionInfoList.Free(); 
    end;
      

  2.   

    先声明,我是参考大富翁上的代码结合Delphi帮助写的,
      

  3.   

    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;
      lDummy : DWORD;
      value:pchar;begin
    S:=Application.ExeName;
    n:=GetFileVersionInfoSize(PChar(s),lDummy);
    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;
    我自己写了一个函数,总是报错?大家看一下那的原因啊!我可是个新手啊,大家多多帮助!
      

  4.   

    第一条、先看看这个函数声明
    function VerQueryValue(pBlock:Pointer;lpSubBlock:PChar;
            var lplpBuffer:Pointer;var puLen :Cardinal):Boolean;
    知不知道是哪错啦?第二条、040904E4这一串应该以
    { 取文件版本信息的所在 }
          VerQueryValue(PAllVersionInfo,'\VarFileInfo\Translation',PVersionInfo,
            VersionInfoSize);
          if PVersionInfo <> nil then
          begin
            TransLationStr :=IntToHex(MakeLong(HiWord(Longint(PVersionInfo^)),
              LoWord(Longint(PVersionInfo^))), 8);
          end;
    方式得到最后改了一下你的代码
    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,TranslationStr:string;
      n,len,i:integer;
      lDummy : DWORD;
      buf,value:PChar;
    begin
      S:=Application.ExeName;
      n:=GetFileVersionInfoSize(PChar(s),lDummy);
      if n>0 then
      begin
        buf:=AllocMem(n);
        Memo1.Lines.Add('FileVersionInfoSize='+IntToStr(n));
        GetFileVersionInfo(Pchar(s),lDummy,n,Buf);    value :=nil;
        { 取文件版本信息的所在 }
        VerQueryValue(Pointer(buf),'\VarFileInfo\Translation',Pointer(value),Cardinal(len));
        if value <> nil then
        begin
            TransLationStr :=IntToHex(MakeLong(HiWord(Longint(Pointer(value)^)),
              LoWord(Longint(Pointer(value)^))), 8);
        end;
        //showmessage(TransLationStr);    for i:=1 to infoNum do
        begin
          if  VerQueryValue(Pointer(Buf),Pchar('StringFileInfo\'+TransLationStr+'\'+InfoStr[i]),Pointer(value),Cardinal(len)) then
            Memo1.Lines.Add(InfoStr[i]+'='+String(Value));
        end;
         FreeMem(Buf,n);
      end
      else
        memo1.Lines.Add('No FileVersionInfo found');end;