首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

读取版本信息的函数有BUG,寻求帮忙修正!解决方法

2012-03-01 
读取版本信息的函数有BUG,寻求帮忙修正!我使用这函数来读取文件的版本信息:function jzlGetVersion(filena

读取版本信息的函数有BUG,寻求帮忙修正!
我使用这函数来读取文件的版本信息:
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?

[解决办法]
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;
[解决办法]
如果不加那一行,你的函数有可能会执行Result语句,此时相当于没有调用过这个函数。

热点排行