Page 1 of 1
Change the Version Info on an EXE?? how??
Posted: Sun Oct 31, 2004 5:48 am
by cool_tester
Hello all is it possible by using MadRes to change another exe file Version info, You know the comments and company name.. so on...?
I tried using the PE Edtior which works but the modified exe version info appears empty under win9x, where it looks fine under win2k... does anyone know why?
my guess is that something is not calculated right when the change is made..
Thank you.
Posted: Mon Nov 01, 2004 2:27 pm
by madshi
Yes, madRes can do that. I don't know exactly how the format of the version resource looks like, though. So I can only say "yes, madRes can do that", but I can't say how exactly. You need to find out how the version format looks like. That's surely documented somewhere.
Posted: Mon Nov 01, 2004 9:04 pm
by cool_tester
Thanks for the reply:
This is what i can find out so far..
Code: Select all
1 VERSIONINFO
FILEVERSION 1, 0, 0, 0
PRODUCTVERSION 1, 0, 0, 0
FILEFLAGSMASK VS_FF_DEBUG, VS_FF_INFOINFERRED, VS_FF_PATCHED, VS_FF_PRERELEASE, VS_FF_PRIVATEBUILD, VS_FF_SPECIALBUILD
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
{
BLOCK "StringFileInfo"
{
BLOCK "040904b0"
{
VALUE "Comments", "My Comments\000"
VALUE "CompanyName", "My Company\000"
VALUE "FileDescription", "My Description\000"
VALUE "FileVersion", "1, 0, 0, 0\000"
VALUE "InternalName", "My File Name\000"
VALUE "LegalCopyright", "Copyright © My Company\000"
VALUE "LegalTrademarks", "$$\000"
VALUE "OriginalFilename", "MyFileName.exe\000"
VALUE "ProductName", "My Product\000"
VALUE "ProductVersion", "1, 0, 0, 0\000"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 1033, 1200
}
}
VALUE "", "\000"
Is this what i need if yes how do i update the exe..
Thank you.
Posted: Mon Nov 01, 2004 9:28 pm
by madshi
This is the text form of the version information. I think it's in the exe in compiled/binary form.
Posted: Tue Sep 30, 2008 2:08 pm
by cox
Go to
http://www.wilsonc.demon.co.uk/delphi.htm, download ResourceUtils. Demos are not included, so you must also download Resource Editor source to learn how to use it.
I written simple demo how to edit version info (put on form button and listbox):
Code: Select all
uses unitPEFile, unitNTModule, unitResourceDetails, unitResourceVersionInfo;
const
UseWinAPIParser = False;
var
M: TResourceModule;
D: TResourceDetails;
V: TVersionInfoResourceDetails;
F: TVersionFileFlags;
function VersionToString(version: TULargeInteger): string;
begin
with version do
result := Format('%d.%d.%d.%d', [HiWord(HighPart), LoWord(HighPart),
HiWord(LowPart), LoWord(LowPart)]);
end;
function StringToVersion (const version : string) : TULargeInteger;
var
p : Integer;
s : string;
hh, h, l, ll : word;
ok : boolean;
begin
hh := 0;
ll := 0;
h := 0;
l := 0;
s := version;
p := Pos ('.', s);
ok := False;
if p > 0 then
begin
hh := StrToInt (Copy (s, 1, p - 1));
s := Copy (s, p + 1, MaxInt);
p := Pos ('.', s);
if p > 0 then
begin
h := StrToInt (Copy (s, 1, p - 1));
s := Copy (s, p + 1, MaxInt);
p := Pos ('.', s);
if p > 0 then
begin
l := StrToInt (Copy (s, 1, p - 1));
ll := StrToInt (Copy (s, p + 1, MaxInt));
ok := True;
end
end
end;
if not ok then
raise exception.Create ('ver format error');
result.HighPart := 65536 * hh + h;
result.LowPart := 65536 * l + ll;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I, J: Integer;
begin
if (Win32Platform = VER_PLATFORM_WIN32_NT) and UseWinAPIParser then
M := TNTModule.Create
else
M := TPEResourceModule.Create // more effective than TNTModule
;
try
M.LoadFromFile('test.exe');
for I := 0 to M.ResourceCount - 1 do
begin
D := M.ResourceDetails[I];
if D is TVersionInfoResourceDetails then
begin
V := TVersionInfoResourceDetails(D);
F := V.FileFlags;
for J := 0 to V.KeyCount - 1 do
ListBox1.Items.Add(V.Key[J].KeyName + ': ' + V.Key[J].Value);
;
V.ProductVersion := StringToVersion('10.0.2.59');
V.FileVersion := V.ProductVersion;
V.FileFlags := F; // flags must be update ever (!!!)
V.SetKeyValue('FileVersion', '10.0.2.59');
V.SetKeyValue('ProductVersion', '10.0.2.59');
M.SaveToFile('test.exe');
Break;
end;
end;
finally
M.Free;
end;
end;
If somebody know how to do this with madRes please notify me!
Posted: Tue Oct 21, 2008 2:35 pm
by endage
hallo cox,
i've tried your example but everytime i'm using the V.SetKeyValue
i'm getting corrupt version info data - which means windows is not able
to display them. basicly the updated information looks correct with
a resource hacker, the only different is the block value (BLOCK "0C090000").
but i'm not sure that the problemes lays there.
do you have an idea how to fix this?
thanks and regards
Posted: Wed Oct 07, 2009 8:49 am
by LAK
endage wrote: getting corrupt version info data - which means windows is not able to display them.
Probably the wrong codepage is set, you should fix it like this:
Code: Select all
if D is TVersionInfoResourceDetails then
begin
D.CodePage := 1251; //your codepage here
V := TVersionInfoResourceDetails(D);
F := V.FileFlags;