Hola a todos,
Sí; utilizando la siguiente función, si bien, probándola, he visto que todo parece ir bien excepto el "FileVersion"... parece que esa "clave" en particular no se cambia y no sé bien porqué ahora mismo... en fin... espero que te pueda servir.
Código Delphi
[-]
function UpdateExeInfo(const ExePath, CompanyName, FileDescription,
FileVersion, InternalName, LegalCopyright, LegalTrademarks, OriginalFileName,
ProgramID, ProductName, ProductVersion, Comments: string): Boolean;
type
PLangAndCodePage = ^TLangAndCodePage;
TLangAndCodePage = packed record
wLanguage: Word;
wCodePage: Word;
end;
var
Size, Unused: DWORD;
VerData: PByte;
Value: Pointer;
Len, VerLen, I: UINT;
Translate: PLangAndCodePage;
KeyName: WideString;
AFileVersion: LPWSTR;
hUpdate: THandle;
Updated: BOOL;
begin
Result := False;
if not FileExists(ExePath) then
Exit;
Size := GetFileVersionInfoSize(PChar(ExePath), Unused);
if Size <> 0 then
begin
GetMem(VerData, Size);
try
if GetFileVersionInfo(PChar(ExePath), 0, Size, VerData) then
begin
Value := nil;
Len := 0;
VerQueryValue(VerData, '\', Value, Len);
Value := nil;
Len := 0;
VerQueryValue(VerData, '\VarFileInfo\Translation', Value, Len);
Translate := PLangAndCodePage(Value);
for I := 0 to (Len div SizeOf(TLangAndCodePage)) - 1 do
begin
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'CompanyName';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(CompanyName));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'FileDescription';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(FileDescription));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'FileVersion';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(FileVersion));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'InternalName';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(InternalName));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'LegalCopyright';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(LegalCopyright));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'LegalTrademarks';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(LegalTrademarks));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'OriginalFileName';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(OriginalFileName));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'ProgramID';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(ProgramID));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'ProductName';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(ProductName));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'ProductVersion';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(ProductVersion));
end;
KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
IntToHex(Translate^.wCodePage, 4) + '\' + 'Comments';
Value := nil;
VerLen := 0;
if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
begin
AFileVersion := PWideChar(Value);
ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
wsprintfW(AFileVersion, PWideChar(Comments));
end;
Inc(Translate);
end;
hUpdate := BeginUpdateResource(PChar(ExePath), False);
if hUpdate <> 0 then
begin
Updated := UpdateResource(hUpdate, RT_VERSION,
MAKEINTRESOURCE(VS_VERSION_INFO), MAKELANGID(LANG_NEUTRAL,
SUBLANG_NEUTRAL), VerData, Size);
EndUpdateResource(hUpdate, not Updated);
end;
end;
finally
FreeMem(VerData);
end;
end;
end;