这个是我的源程序,但是结果是错误的,label.caption的值是奇怪的结果。你能帮我看看是哪儿出错了吗?还有VersionInfo这个pointer我可以用什么方法显示它指向地址的内容吗?谢谢!
var
  ver:variant;
  VerInfoSize: DWORD;         
  GetInfoSizeJunk: DWORD;     
  VersionInfo: Pointer;       
  Translation: Pointer;       
  InfoPointer: Pointer;       
  VersionInfoSize: UINT;      
  VersionValue: string;       
begin
  VerInfoSize := 0;
  if OpenDialog1.Execute  then
  VerInfoSize := GetFileVersionInfoSize(PChar(OpenDialog1.FileName),
                                        GetInfoSizeJunk);
   GetMem(VersionInfo, VerInfoSize);
   GetFileVersionInfo(PChar(OpenDialog1.FileName),
                              0,VerInfoSize, VersionInfo);
  VerQueryValue(VersionInfo, '\VarFileInfo\Translation',
                  Translation, VersionInfoSize);
  VersionValue :='\StringFileInfo\'+
                  IntToHex(LoWord(LongInt(Translation^)),4)+
                  IntToHex(HiWordLongIntTranslation^)),4+'\';
      VerQueryValue(VersionInfo, PChar(VersionValue+'ProductVersion'), InfoPointer,VersionInfoSize);
   Label1.Caption := string(PChar(VersionInfo));
   FreeMem(VersionInfo, VerInfoSize);
end;
end.

解决方案 »

  1.   

    哥们,怪我了,我给你的信息不全,那个Translation: PLANGANDCODEPAGE;的类型是这样的;type
      TLANGANDCODEPAGE = record
        wLanguage,
        wCodePage: Word;
      end;
      PLANGANDCODEPAGE = ^TLANGANDCODEPAGE;var
      InfoSize , Zero : DWORD;
      VersionInfo ,Info : Pointer;
      Translation: PLANGANDCODEPAGE;
      InfoPath : String;
    begin
    后面的就用我上次贴的吧。另外你说的 显示它指向地址的内容 是不是这样?format('%.8x',[...]);
      

  2.   

    Type TFileVersionInfo = Record
      FixedInfo:TVSFixedFileInfo;    {版本信息}
      CompanyName:String;            {公司名称}
      FileDescription:String;        {说明}
      FileVersion:String;            {文件版本}
      InternalName:String;           {内部名称}
      LegalCopyright:String;         {版权}
      LegalTrades:String;        {合法商标}
      OriginalFilename:String;       {源文件名}
      ProductName:String;            {产品名称}
      ProductVersion:String;         {产品版本}
      Comments:String;               {备注}
    end;
    Function GetFileVerInfo(ExeFileName :Pchar;var VerSionInfo:TFileVersionInfo):Boolean;
    var
      dwHandle, dwVersionSize   : DWORD;
      Find                      : String;
      pcBuffer                  : PChar;
      pTemp                     : Pointer;
      FileVersionInfo           : TVSFixedFileInfo;
    begin
      Find := '\';
      dwVersionSize := GetFileVersionInfoSize( PChar(ExeFilename),dwHandle );
      if dwVersionSize = 0 then  begin
        Result:=False;
        Exit;
      end;
      GetMem( pcBuffer, dwVersionSize );
      if not GetFileVersionInfo( PChar(ExeFilename),dwHandle,dwVersionSize,pcBuffer ) then begin
        FreeMem(pcBuffer);
        Result:=False;
        Exit;
      end;
      if not VerQueryValue( pcBuffer,PChar(Find),pTemp,dwVersionSize ) then begin
        FreeMem(pcBuffer);
        Result:=False;
        Exit;
      end;
      FileVersionInfo:=PVSFixedFileInfo(pTemp)^;
      With FileVersionInfo do begin
        VersionInfo.FixedInfo.dwSignature:=dwSignature;
        VersionInfo.FixedInfo.dwStrucVersion:=dwStrucVersion;
        VersionInfo.FixedInfo.dwFileVersionMS:=dwFileVersionMS;
        VersionInfo.FixedInfo.dwFileVersionLS:=dwFileVersionLS;
        VersionInfo.FixedInfo.dwProductVersionMS:=dwProductVersionMS;
        VersionInfo.FixedInfo.dwProductVersionLS:=dwProductVersionLS;
        VersionInfo.FixedInfo.dwFileFlagsMask:=FileVersionInfo.dwFileFlagsMask;
        VersionInfo.FixedInfo.dwFileFlags:=fileVersionInfo.dwFileFlags;
        VersionInfo.FixedInfo.dwFileOS:=FileVersionInfo.dwFileOS;
        VersionInfo.FixedInfo.dwFileType:=FileVersionInfo.dwFileType;
        VersionInfo.FixedInfo.dwFileSubtype:=FileVersionInfo.dwFileSubtype;
        VersionInfo.FixedInfo.dwFileDateMS:=FileVersionInfo.dwFileDateMS;
        VersionInfo.FixedInfo.dwFileDateLS:=FileVersionInfo.dwFileDateLS;
      end;
      Find := '\StringFileInfo\080403A8\';
      if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then
        VersionInfo.CompanyName:=PChar(pTemp)
      else begin
        Find := '\StringFileInfo\040904E4\';
        if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then
          VersionInfo.CompanyName:=PChar(pTemp)
        else begin
          Result:=False;
          Exit;
        end;
      end;
      if VerQueryValue( pcBuffer,PChar(Find+'FileDescription'),pTemp,dwVersionSize ) then
        VersionInfo.FileDescription:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'FileVersion'),pTemp,dwVersionSize ) then
        VersionInfo.FileVersion:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'InternalName'),pTemp,dwVersionSize ) then
        VersionInfo.InternalName:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'LegalCopyright'),pTemp,dwVersionSize ) then
        VersionInfo.LegalCopyright:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'LegalTrades'),pTemp,dwVersionSize ) then
        VersionInfo.LegalTrades:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'OriginalFilename'),pTemp,dwVersionSize ) then
        VersionInfo.OriginalFilename:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'ProductName'),pTemp,dwVersionSize ) then
        VersionInfo.ProductName:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'ProductVersion'),pTemp,dwVersionSize ) then
        VersionInfo.ProductVersion:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'Comments'),pTemp,dwVersionSize ) then
        VersionInfo.Comments:=PChar(pTemp);
      FreeMem(pcBuffer );
      Result:=True;
    end;