我使用这函数来读取文件的版本信息:
function jzlGetVersion(filename:string):string;
var
  InfoSize, Wnd: DWORD;
  VerBuf: Pointer;
  szName: array[0..255] of Char;
  Value: Pointer;
  Len: UINT;
  TransString:string;
begin
  InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
  if InfoSize <> 0 then
  begin
    GetMem(VerBuf, InfoSize);
    try
      if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
      begin
        Value :=nil;
        VerQueryValue(VerBuf, '\VarFileInfo\Translation', Value, Len);
        if Value <> nil then
           TransString := IntToHex(MakeLong(HiWord(Longint(Value^)), LoWord(Longint(Value^))), 8);
        Result := '';
        StrPCopy(szName, '\StringFileInfo\'+Transstring+'\ProductVersion');
        if VerQueryValue(VerBuf, szName, Value, Len) then
           Result := StrPas(PChar(Value));
      end;
    finally
      FreeMem(VerBuf);
    end;
  end;
end;
调用:s:='V :'+jzlGetVersion(Application.ExeName);-------------------------------
但发现个BUG,就是当遍历某文件夹的所有.exe文件时,遇到没有版权信息的.exe文件,就会返回上个文件的版权信息。(而我是希望无版权信息的文件能返回空值)请帮忙看看有没有办法修复此BUG?

解决方案 »

  1.   

    unction jzlGetVersion(filename:string):string; 
    var 
      InfoSize, Wnd: DWORD; 
      VerBuf: Pointer; 
      szName: array[0..255] of Char; 
      Value: Pointer; 
      Len: UINT; 
      TransString:string; 
    begin 
      Result:='';//是不是这的问题?  InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd); 
      if InfoSize  < > 0 then 
      begin 
        GetMem(VerBuf, InfoSize); 
        try 
          if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then 
          begin 
            Value :=nil; 
            VerQueryValue(VerBuf,  '\VarFileInfo\Translation ', Value, Len); 
            if Value  < > nil then 
               TransString := IntToHex(MakeLong(HiWord(Longint(Value^)), LoWord(Longint(Value^))), 8); 
            Result :=  ' '; 
            StrPCopy(szName,  '\StringFileInfo\ '+Transstring+ '\ProductVersion '); 
            if VerQueryValue(VerBuf, szName, Value, Len) then 
               Result := StrPas(PChar(Value)); 
          end; 
        finally 
          FreeMem(VerBuf); 
        end; 
      end; 
    end; 
      

  2.   

    To:madyak,你的方法成功了,请问是什么原因引起?
      

  3.   

    如果不加那一行,你的函数有可能会执行Result语句,此时相当于没有调用过这个函数。
      

  4.   

    如果不加那一行,你的函数有可能不执行Result语句,此时相当于没有调用过这个函数。