读取版本信息的函数有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语句,此时相当于没有调用过这个函数。