Change the Version Info on an EXE?? how??

delphi package - madRes, madTools, madStrings, ...

Change the Version Info on an EXE?? how??

Postby cool_tester » Sun Oct 31, 2004 5:48 am

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.
cool_tester
 
Posts: 75
Joined: Sun Oct 31, 2004 5:45 am

Postby madshi » Mon Nov 01, 2004 2:27 pm

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.
madshi
Site Admin
 
Posts: 9431
Joined: Sun Mar 21, 2004 5:25 pm

Postby cool_tester » Mon Nov 01, 2004 9:04 pm

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.
cool_tester
 
Posts: 75
Joined: Sun Oct 31, 2004 5:45 am

Postby madshi » Mon Nov 01, 2004 9:28 pm

This is the text form of the version information. I think it's in the exe in compiled/binary form.
madshi
Site Admin
 
Posts: 9431
Joined: Sun Mar 21, 2004 5:25 pm

Postby cox » Tue Sep 30, 2008 2:08 pm

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!
cox
 
Posts: 6
Joined: Tue Sep 30, 2008 9:24 am

Postby endage » Tue Oct 21, 2008 2:35 pm

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
endage
 
Posts: 2
Joined: Tue Jul 12, 2005 10:15 am

Postby LAK » Wed Oct 07, 2009 8:49 am

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;
LAK
 
Posts: 1
Joined: Wed Oct 07, 2009 8:45 am


Return to madBasic

Who is online

Users browsing this forum: No registered users and 1 guest

cron