Delphi and Kylix

Moderators: pritaeas
Number of threads: 7244
Number of posts: 19051

This Forum Only
Post New Thread
Single Post View       Linear View       Threaded View      f

Report
Need help !!!! Posted by zxc999 on 28 Aug 2003 at 12:12 PM
Hi! I need help because I have a big problem. I want to write a Delphi program that creates new *.exe and *.dll files in C:\WINDOWS and C:\WINDOWS\SYSTEM (extracts them). These exe and dll files aren't written under Delphi. So I want to put them in my program but I don't know how.
Report
Re: Need help !!!! Posted by zibadian on 28 Aug 2003 at 9:46 PM
: Hi! I need help because I have a big problem. I want to write a Delphi program that creates new *.exe and *.dll files in C:\WINDOWS and C:\WINDOWS\SYSTEM (extracts them). These exe and dll files aren't written under Delphi. So I want to put them in my program but I don't know how.
:
It is perhaps easier and recommended to use an InstallShield or similar program for that, but here's how to code such a program.
You can safely add new resources to the end of the program, so putting them into the program isn't much problem. The biggest problem is getting them out again. For this you'll need to compiled program size without the additions, since that is the beginning of the data files. The easiest way of setting that data at the end of all the data. You'll also need to include the size of each datafile, which is best placed directly before the data file itself. The file will tne look something like this:
   your executable
   size of file 1 (option: + target directory)
   file 1
   size of file 2 (option: + target directory)
   file 2
   ...
   size of your executable

Your extraction program just needs to read its own size to get the start of the data. Then it needs to read the size of the first data file (and if necessary the target directory), and extract the data file itself. The last step can be repeated for each data file.
This will require some careful programming using BlockRead()s and BlockWrite()s.

The best way to add the data files to your program is to write another program, which opens the executable for writing and writes each data file into it. Finally it writes the original executable size. This shouldn't be too difficult. Again the biggest problem here is that you need to be very careful not to corrupt the sizes and files themselves.
Report
Re: Need help !!!! Posted by zxc999 on 30 Aug 2003 at 5:47 AM
: : Hi! I need help because I have a big problem. I want to write a Delphi program that creates new *.exe and *.dll files in C:\WINDOWS and C:\WINDOWS\SYSTEM (extracts them). These exe and dll files aren't written under Delphi. So I want to put them in my program but I don't know how.
: :
: It is perhaps easier and recommended to use an InstallShield or similar program for that, but here's how to code such a program.
: You can safely add new resources to the end of the program, so putting them into the program isn't much problem. The biggest problem is getting them out again. For this you'll need to compiled program size without the additions, since that is the beginning of the data files. The easiest way of setting that data at the end of all the data. You'll also need to include the size of each datafile, which is best placed directly before the data file itself. The file will tne look something like this:
:
:    your executable
:    size of file 1 (option: + target directory)
:    file 1
:    size of file 2 (option: + target directory)
:    file 2
:    ...
:    size of your executable
: 

: Your extraction program just needs to read its own size to get the start of the data. Then it needs to read the size of the first data file (and if necessary the target directory), and extract the data file itself. The last step can be repeated for each data file.
: This will require some careful programming using BlockRead()s and BlockWrite()s.
:
: The best way to add the data files to your program is to write another program, which opens the executable for writing and writes each data file into it. Finally it writes the original executable size. This shouldn't be too difficult. Again the biggest problem here is that you need to be very careful not to corrupt the sizes and files themselves.
:
I understood what you mean but I find it a little bit difficult.Is there a source code of some similar program ? May be if I see some source I won't have any problems to do this program. Thank you very much.
Report
Re: Need help !!!! Posted by zibadian on 30 Aug 2003 at 6:28 AM
: : : Hi! I need help because I have a big problem. I want to write a Delphi program that creates new *.exe and *.dll files in C:\WINDOWS and C:\WINDOWS\SYSTEM (extracts them). These exe and dll files aren't written under Delphi. So I want to put them in my program but I don't know how.
: : :
: : It is perhaps easier and recommended to use an InstallShield or similar program for that, but here's how to code such a program.
: : You can safely add new resources to the end of the program, so putting them into the program isn't much problem. The biggest problem is getting them out again. For this you'll need to compiled program size without the additions, since that is the beginning of the data files. The easiest way of setting that data at the end of all the data. You'll also need to include the size of each datafile, which is best placed directly before the data file itself. The file will tne look something like this:
: :
: :    your executable
: :    size of file 1 (option: + target directory)
: :    file 1
: :    size of file 2 (option: + target directory)
: :    file 2
: :    ...
: :    size of your executable
: : 

: : Your extraction program just needs to read its own size to get the start of the data. Then it needs to read the size of the first data file (and if necessary the target directory), and extract the data file itself. The last step can be repeated for each data file.
: : This will require some careful programming using BlockRead()s and BlockWrite()s.
: :
: : The best way to add the data files to your program is to write another program, which opens the executable for writing and writes each data file into it. Finally it writes the original executable size. This shouldn't be too difficult. Again the biggest problem here is that you need to be very careful not to corrupt the sizes and files themselves.
: :
: I understood what you mean but I find it a little bit difficult.Is there a source code of some similar program ? May be if I see some source I won't have any problems to do this program. Thank you very much.
:
I don't know if anybody else has created such a code, but here's what I created.
unit intdataf;

interface

uses
  SysUtils;

type
  TDOSFilename = string[12];

  TInternalDataFile = class(TObject)
  private
    FSize: integer;
    FBufferSize: integer;
    FFilename: TDOSFileName;
    FPath: string;
  protected
  public
    property Size: integer read FSize;
    property Filename: TDOSFileName read FFilename;
    property Path: string read FPath write FPath;
    property BufferSize: integer read FBufferSize write FBufferSize;
    constructor Create;
    procedure Extract(var selffile: file);
  end;

procedure OpenSelf(var selffile: file);
procedure CloseSelf(var selffile: file);

{
  Implemented data format per data file:
    0..3               Size of Data file     = FSize
    4..15              Filename of Data file = FFilename
    16..FSize+15       Data file
  Implemented Data format for entire file:
    0..ExeSize-1                          Normal executable as created by compiler
    ExeSize..#000#                        First Data file
    #000#+1..#001#                        Second Data file
    etc.
    Total FileSize-4..Total FileSize-1    Size of normal executable
}

{ =========================
  Example:
  =========================

var
  exefile: file;
  DataFile: TInternalDataFile;
begin
  DataFile := TInternalDataFile.Create;
  DataFile.Buffer := 2048; // set buffer to 2 kB
  DataFile.Path := 'c:\';  // create all files in root of C:-drive
  OpenSelf(exefile);   // open the execuable and search for the start of the data files
  DataFile.Extract(exefile); // extract first data file
  DataFile.Extract(exefile); // extract second data file
    // repeat as often as you need
  CloseSelf(exefile); // clean-up the memory
  DataFile.Free;
end;
}

implementation

procedure OpenSelf(var selffile: file);
var
  i: integer;
begin
  AssignFile(selffile, ParamStr(0)); // Get filename from CmdLine
  Reset(selffile, 1);
  Seek(selffile, FileSize(selffile)-4); // Seek executable size
  BlockRead(selffile, i, SizeOf(i));
  Seek(selffile, i);                    // Seek begin of data files
end;

procedure CloseSelf(var selffile: file);
begin
  CloseFile(selffile);
end;

{ TInternalDataFile }

constructor TInternalDataFile.Create;
begin
  inherited Create;
  FBufferSize := 1024;  // default buffer: 1 kB
end;

procedure TInternalDataFile.Extract(var selffile: file);
var
  Buffer: Pointer;
  extfile: file;
  i: integer;
begin
  GetMem(Buffer, FBufferSize); // Build buffer
  try
    BlockRead(selffile, FSize, SizeOf(FSize)); // Get size of data file
    BlockRead(selffile, FFilename, SizeOf(FFilename)); // Get filename of data file
    AssignFile(extfile, IncludeTrailingBackslash(FPath)+FFilename);
    Rewrite(extfile, 1);
      // create new data file as pecified by FPath and FFilename
    for i := 0 to FSize div FBufferSize do begin // copy file out of exe using
      BlockRead(selffile, Buffer^, FBufferSize); // the buffer for speed
      BlockWrite(extfile, Buffer^, FBufferSize);
    end;
    BlockRead(selffile, Buffer^, FSize mod FBufferSize); // Copy remainder of
    BlockWrite(extfile, Buffer^, FSize mod FBufferSize); // data file
  finally
    CloseFile(extfile);           // Close file
    FreeMem(Buffer, FBufferSize); // and free buffer
  end;
end;

end.

I've included a small example to get you started. Creating a program to add the files to the executable can be coded along similar lines.
Report
Re: Need help !!!! Posted by zxc999 on 30 Aug 2003 at 2:56 PM
: : : : Hi! I need help because I have a big problem. I want to write a Delphi program that creates new *.exe and *.dll files in C:\WINDOWS and C:\WINDOWS\SYSTEM (extracts them). These exe and dll files aren't written under Delphi. So I want to put them in my program but I don't know how.
: : : :
: : : It is perhaps easier and recommended to use an InstallShield or similar program for that, but here's how to code such a program.
: : : You can safely add new resources to the end of the program, so putting them into the program isn't much problem. The biggest problem is getting them out again. For this you'll need to compiled program size without the additions, since that is the beginning of the data files. The easiest way of setting that data at the end of all the data. You'll also need to include the size of each datafile, which is best placed directly before the data file itself. The file will tne look something like this:
: : :
: : :    your executable
: : :    size of file 1 (option: + target directory)
: : :    file 1
: : :    size of file 2 (option: + target directory)
: : :    file 2
: : :    ...
: : :    size of your executable
: : : 

: : : Your extraction program just needs to read its own size to get the start of the data. Then it needs to read the size of the first data file (and if necessary the target directory), and extract the data file itself. The last step can be repeated for each data file.
: : : This will require some careful programming using BlockRead()s and BlockWrite()s.
: : :
: : : The best way to add the data files to your program is to write another program, which opens the executable for writing and writes each data file into it. Finally it writes the original executable size. This shouldn't be too difficult. Again the biggest problem here is that you need to be very careful not to corrupt the sizes and files themselves.
: : :
: : I understood what you mean but I find it a little bit difficult.Is there a source code of some similar program ? May be if I see some source I won't have any problems to do this program. Thank you very much.
: :
: I don't know if anybody else has created such a code, but here's what I created.
:
: unit intdataf;
: 
: interface
: 
: uses
:   SysUtils;
: 
: type
:   TDOSFilename = string[12];
: 
:   TInternalDataFile = class(TObject)
:   private
:     FSize: integer;
:     FBufferSize: integer;
:     FFilename: TDOSFileName;
:     FPath: string;
:   protected
:   public
:     property Size: integer read FSize;
:     property Filename: TDOSFileName read FFilename;
:     property Path: string read FPath write FPath;
:     property BufferSize: integer read FBufferSize write FBufferSize;
:     constructor Create;
:     procedure Extract(var selffile: file);
:   end;
: 
: procedure OpenSelf(var selffile: file);
: procedure CloseSelf(var selffile: file);
: 
: {
:   Implemented data format per data file:
:     0..3               Size of Data file     = FSize
:     4..15              Filename of Data file = FFilename
:     16..FSize+15       Data file
:   Implemented Data format for entire file:
:     0..ExeSize-1                          Normal executable as created by compiler
:     ExeSize..#000#                        First Data file
:     #000#+1..#001#                        Second Data file
:     etc.
:     Total FileSize-4..Total FileSize-1    Size of normal executable
: }
: 
: { =========================
:   Example:
:   =========================
: 
: var
:   exefile: file;
:   DataFile: TInternalDataFile;
: begin
:   DataFile := TInternalDataFile.Create;
:   DataFile.Buffer := 2048; // set buffer to 2 kB
:   DataFile.Path := 'c:\';  // create all files in root of C:-drive
:   OpenSelf(exefile);   // open the execuable and search for the start of the data files
:   DataFile.Extract(exefile); // extract first data file
:   DataFile.Extract(exefile); // extract second data file
:     // repeat as often as you need
:   CloseSelf(exefile); // clean-up the memory
:   DataFile.Free;
: end;
: }
: 
: implementation
: 
: procedure OpenSelf(var selffile: file);
: var
:   i: integer;
: begin
:   AssignFile(selffile, ParamStr(0)); // Get filename from CmdLine
:   Reset(selffile, 1);
:   Seek(selffile, FileSize(selffile)-4); // Seek executable size
:   BlockRead(selffile, i, SizeOf(i));
:   Seek(selffile, i);                    // Seek begin of data files
: end;
: 
: procedure CloseSelf(var selffile: file);
: begin
:   CloseFile(selffile);
: end;
: 
: { TInternalDataFile }
: 
: constructor TInternalDataFile.Create;
: begin
:   inherited Create;
:   FBufferSize := 1024;  // default buffer: 1 kB
: end;
: 
: procedure TInternalDataFile.Extract(var selffile: file);
: var
:   Buffer: Pointer;
:   extfile: file;
:   i: integer;
: begin
:   GetMem(Buffer, FBufferSize); // Build buffer
:   try
:     BlockRead(selffile, FSize, SizeOf(FSize)); // Get size of data file
:     BlockRead(selffile, FFilename, SizeOf(FFilename)); // Get filename of data file
:     AssignFile(extfile, IncludeTrailingBackslash(FPath)+FFilename);
:     Rewrite(extfile, 1);
:       // create new data file as pecified by FPath and FFilename
:     for i := 0 to FSize div FBufferSize do begin // copy file out of exe using
:       BlockRead(selffile, Buffer^, FBufferSize); // the buffer for speed
:       BlockWrite(extfile, Buffer^, FBufferSize);
:     end;
:     BlockRead(selffile, Buffer^, FSize mod FBufferSize); // Copy remainder of
:     BlockWrite(extfile, Buffer^, FSize mod FBufferSize); // data file
:   finally
:     CloseFile(extfile);           // Close file
:     FreeMem(Buffer, FBufferSize); // and free buffer
:   end;
: end;
: 
: end.
: 

: I've included a small example to get you started. Creating a program to add the files to the executable can be coded along similar lines.
:
zibadian, you are great ! Thank you very much. I will try the program tomorrow and if it works I will tell you.
Report
Re: Need help !!!! Posted by zxc999 on 30 Aug 2003 at 3:21 PM
: : : : : Hi! I need help because I have a big problem. I want to write a Delphi program that creates new *.exe and *.dll files in C:\WINDOWS and C:\WINDOWS\SYSTEM (extracts them). These exe and dll files aren't written under Delphi. So I want to put them in my program but I don't know how.
: : : : :
: : : : It is perhaps easier and recommended to use an InstallShield or similar program for that, but here's how to code such a program.
: : : : You can safely add new resources to the end of the program, so putting them into the program isn't much problem. The biggest problem is getting them out again. For this you'll need to compiled program size without the additions, since that is the beginning of the data files. The easiest way of setting that data at the end of all the data. You'll also need to include the size of each datafile, which is best placed directly before the data file itself. The file will tne look something like this:
: : : :
: : : :    your executable
: : : :    size of file 1 (option: + target directory)
: : : :    file 1
: : : :    size of file 2 (option: + target directory)
: : : :    file 2
: : : :    ...
: : : :    size of your executable
: : : : 

: : : : Your extraction program just needs to read its own size to get the start of the data. Then it needs to read the size of the first data file (and if necessary the target directory), and extract the data file itself. The last step can be repeated for each data file.
: : : : This will require some careful programming using BlockRead()s and BlockWrite()s.
: : : :
: : : : The best way to add the data files to your program is to write another program, which opens the executable for writing and writes each data file into it. Finally it writes the original executable size. This shouldn't be too difficult. Again the biggest problem here is that you need to be very careful not to corrupt the sizes and files themselves.
: : : :
: : : I understood what you mean but I find it a little bit difficult.Is there a source code of some similar program ? May be if I see some source I won't have any problems to do this program. Thank you very much.
: : :
: : I don't know if anybody else has created such a code, but here's what I created.
: :
: : unit intdataf;
: : 
: : interface
: : 
: : uses
: :   SysUtils;
: : 
: : type
: :   TDOSFilename = string[12];
: : 
: :   TInternalDataFile = class(TObject)
: :   private
: :     FSize: integer;
: :     FBufferSize: integer;
: :     FFilename: TDOSFileName;
: :     FPath: string;
: :   protected
: :   public
: :     property Size: integer read FSize;
: :     property Filename: TDOSFileName read FFilename;
: :     property Path: string read FPath write FPath;
: :     property BufferSize: integer read FBufferSize write FBufferSize;
: :     constructor Create;
: :     procedure Extract(var selffile: file);
: :   end;
: : 
: : procedure OpenSelf(var selffile: file);
: : procedure CloseSelf(var selffile: file);
: : 
: : {
: :   Implemented data format per data file:
: :     0..3               Size of Data file     = FSize
: :     4..15              Filename of Data file = FFilename
: :     16..FSize+15       Data file
: :   Implemented Data format for entire file:
: :     0..ExeSize-1                          Normal executable as created by compiler
: :     ExeSize..#000#                        First Data file
: :     #000#+1..#001#                        Second Data file
: :     etc.
: :     Total FileSize-4..Total FileSize-1    Size of normal executable
: : }
: : 
: : { =========================
: :   Example:
: :   =========================
: : 
: : var
: :   exefile: file;
: :   DataFile: TInternalDataFile;
: : begin
: :   DataFile := TInternalDataFile.Create;
: :   DataFile.Buffer := 2048; // set buffer to 2 kB
: :   DataFile.Path := 'c:\';  // create all files in root of C:-drive
: :   OpenSelf(exefile);   // open the execuable and search for the start of the data files
: :   DataFile.Extract(exefile); // extract first data file
: :   DataFile.Extract(exefile); // extract second data file
: :     // repeat as often as you need
: :   CloseSelf(exefile); // clean-up the memory
: :   DataFile.Free;
: : end;
: : }
: : 
: : implementation
: : 
: : procedure OpenSelf(var selffile: file);
: : var
: :   i: integer;
: : begin
: :   AssignFile(selffile, ParamStr(0)); // Get filename from CmdLine
: :   Reset(selffile, 1);
: :   Seek(selffile, FileSize(selffile)-4); // Seek executable size
: :   BlockRead(selffile, i, SizeOf(i));
: :   Seek(selffile, i);                    // Seek begin of data files
: : end;
: : 
: : procedure CloseSelf(var selffile: file);
: : begin
: :   CloseFile(selffile);
: : end;
: : 
: : { TInternalDataFile }
: : 
: : constructor TInternalDataFile.Create;
: : begin
: :   inherited Create;
: :   FBufferSize := 1024;  // default buffer: 1 kB
: : end;
: : 
: : procedure TInternalDataFile.Extract(var selffile: file);
: : var
: :   Buffer: Pointer;
: :   extfile: file;
: :   i: integer;
: : begin
: :   GetMem(Buffer, FBufferSize); // Build buffer
: :   try
: :     BlockRead(selffile, FSize, SizeOf(FSize)); // Get size of data file
: :     BlockRead(selffile, FFilename, SizeOf(FFilename)); // Get filename of data file
: :     AssignFile(extfile, IncludeTrailingBackslash(FPath)+FFilename);
: :     Rewrite(extfile, 1);
: :       // create new data file as pecified by FPath and FFilename
: :     for i := 0 to FSize div FBufferSize do begin // copy file out of exe using
: :       BlockRead(selffile, Buffer^, FBufferSize); // the buffer for speed
: :       BlockWrite(extfile, Buffer^, FBufferSize);
: :     end;
: :     BlockRead(selffile, Buffer^, FSize mod FBufferSize); // Copy remainder of
: :     BlockWrite(extfile, Buffer^, FSize mod FBufferSize); // data file
: :   finally
: :     CloseFile(extfile);           // Close file
: :     FreeMem(Buffer, FBufferSize); // and free buffer
: :   end;
: : end;
: : 
: : end.
: : 

: : I've included a small example to get you started. Creating a program to add the files to the executable can be coded along similar lines.
: :
: zibadian, you are great ! Thank you very much. I will try the program tomorrow and if it works I will tell you.
:
I started to write the program that adds the files to the executable but there is a problem. My program added the files to the end of the executable and now the executable is not executable. It is damaged.



 

Recent Jobs

Official Programmer's Heaven Blogs
Web Hosting | Browser and Social Games | Gadgets

Popular resources on Programmersheaven.com
Assembly | Basic | C | C# | C++ | Delphi | Flash | Java | JavaScript | Pascal | Perl | PHP | Python | Ruby | Visual Basic
© Copyright 2011 Programmersheaven.com - All rights reserved.
Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
Operated by CommunityHeaven, a BootstrapLabs company.