我使用这函数来读取文件的版本信息:
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?
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?
解决方案 »
- 让我沉吧~~~
- FAX SERVER 问题
- 内嵌调用可执行文件
- 转贴:今天是我的生日 爆笑~,祝大家节日快乐!~
- 怎样才能把LCDNumber控件加到控件夹中……??
- 高手请进:如何在WinNT以上系统进行BIOS读取!
- 请教ActiveForm作为前台开发的优点和缺点!!!
- ComboBox2.Items.Assign(Screen.Fonts);可以读出字体到combobox2中,如果我想把字体的大小读入怎么做呢?
- 请教大家一个问题:pc唤醒触发了什么事件
- 各位,那里有DELPHI原码
- GetCostFunc: TGetCostFunc; 是什么意思 定义变量么?
- 程序有2个timer,如果第一个忙的时候,第二个timer到时间触发吗?
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;