Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Batch Dateien (https://www.delphipraxis.net/46170-batch-dateien.html)

spike0 19. Mai 2005 22:26


Batch Dateien
 
Ich möchte in meinem Programm eine Option einfügen, die es ermöglicht, aus .bat Dateien .exe Dateien zu machen (so ein Programm habe ich schon gesehen)

Wie kann man es machen?
Ich habe mir überlegt, dass es vielleicht so einen Batch-Befehl gibt, den man einfach am Ende der Datei einfügt.

DGL-luke 19. Mai 2005 22:33

Re: Batch Dateien
 
also batchbefehl gibts da sicher keinen. da müsste ja in windows ein compiler drin sein.

du müsstest da aber wirklich mit compiler schreiben anfangen.

marabu 20. Mai 2005 06:30

Re: Batch Dateien
 
Es gibt da verschiedene Ansätze.

Beim einfachsten Ansatz "Hidden Batch" schreibst du zwei Programme. Eines extrahiert eine Befehlsstapel-Resource und übergibt den Stapel an die System-Shell. Das andere erzeugt die Resource und kompiliert sie in das erste Programm. Auf diese Weise werden Befehlsstapel vor fahrlässiger Modifikation geschützt.

Beim Ansatz "Custom Shell" gehst du ähnlich vor. Wieder erzeugst du eine Resource, aber das ausführende Programm muss alle Shell-Funktionen selbst abwickeln, z.B. Eingabe-Ausgabe-Umleitung, Auswertung von Fehler-Codes, Behandlung von Umgebungsvariablen. Dazu kommt noch die Nachbildung interner Shell-Befehle, wie DIR und COPY.

Wenn Schutz vor Modifikation durch das Envelope-Konzept nicht ausreicht, dann musst du die Befehlsstapel noch in P-Code umwandeln.

Grüße vom marabu

spike0 20. Mai 2005 07:46

Re: Batch Dateien
 
Also ich habe wirklich kaum etwas verstanden :) , aber "Hidden Batch" klingt am leichtesten.

Zitat:

Beim einfachsten Ansatz "Hidden Batch" schreibst du zwei Programme. Eines extrahiert eine Befehlsstapel-Resource und übergibt den Stapel an die System-Shell. Das andere erzeugt die Resource und kompiliert sie in das erste Programm. Auf diese Weise werden Befehlsstapel vor fahrlässiger Modifikation geschützt.
Wie würde so in etwa der Quelltext aussehen?

marabu 20. Mai 2005 08:13

Re: Batch Dateien
 
Du willst das ganze bestimmt lieber selbst programmieren, deshalb hier nur eine Skizze für das erste Programm aus dem HIDDEN BATCH Ansatz.

Code:
procedure StoreBatch;
begin
  FindResource();
  LoadResource();
  LockResource();
  SchreibeResourceInFileStream;
  FreeResource();
end;
Grüße vom marabu

spike0 20. Mai 2005 08:35

Re: Batch Dateien
 
Natürlich würde ich es lieber selber programmieren, wenn ich davon Ahnung hätte :) , aber dann hätte ich dies hier nicht gepostet :)
Ich bin noch ein Anfänger und deshalb kann ich ja noch nicht alles in Delphi programmieren.

marabu 20. Mai 2005 08:44

Re: Batch Dateien
 
Ganz ohne Ahnung solltest du kleinere Brötchen backen. Aber mein Pseudo-Code ist wirklich schon fast komplett. Benutze die Online-Hilfe und heute nachmittag läuft das erste Programm. Du schaffst das. Da bin ich ganz sicher.

marabu

MathiasSimmack 20. Mai 2005 09:15

Re: Batch Dateien
 
Zitat:

Zitat von spike0
Ich bin noch ein Anfänger und deshalb kann ich ja noch nicht alles in Delphi programmieren.

Zumindest hast du schon mal herausgefunden, wie man in einem anderen Forum die gleiche Frage noch einmal stellt, obwohl du hier schon fast eine komplette Lösung hast. :roll:

Luckie 20. Mai 2005 10:21

Re: Batch Dateien
 
Wenn du schon selbst sagst, dass du Anfänger bist, wie wäre es dann, wenn du mit etwas einfacheren anfangen würdest und nicht gleich mit so was?

spike0 20. Mai 2005 19:36

Re: Batch Dateien
 
Zitat:

Wenn du schon selbst sagst, dass du Anfänger bist, wie wäre es dann, wenn du mit etwas einfacheren anfangen würdest und nicht gleich mit so was?
1. Ja ich bin ein Anfänger und
2. ich fange auch mit etwas anderem an (das hier sollte bloß eine Option des Programms sein)
3. Woher soll ich denn wissen, dass es nicht so leicht ist? Es könnte ja eine banale Antwort darauf geben können!

Zitat:

Zumindest hast du schon mal herausgefunden, wie man in einem anderen Forum die gleiche Frage noch einmal stellt, obwohl du hier schon fast eine komplette Lösung hast.
4. Ich bin der Meinung, dass es in anderen Foren Personen geben kann, die vielleicht eine einfache Lösung haben können.
Ich habe in 4 Foren eine Frage gestellt, bis hier endlich eine Antwort kam.
Bei den anderen Foren hatte keiner ne Idee, und dabei handelte es sich um einen einzigen und ganz simplen Befehl!

Außerdem: "Ne komplette Lösung" ?!
Hier stehen ein paar Zeilen, und ich soll daraus einen Compiler basteln?!

DGL-luke 20. Mai 2005 19:55

Re: Batch Dateien
 
so is es auch wieder nicht. das mit dem compiler von mir war nicht ganz richtig.

du verpackst die batch-datei nur zuerst in eine ressource, und dein prog holt sie dann nur wieder heraus, schreibt sie in eine datei, und sagt windows, dass es die batchdatei ausführen soll.
alles nicht so wild.

du brauchst also:

- ein programm das aus einer ressource eine batchdatei macht und diese an windows übergibt
- ein programm, das aus einer batchdatei eine ressource macht und diese dem ersten programm beilegt oder, idealerweise, direkt in die exe die ressource reineditiert(es gibt programme, die können das, ob es bereits fertige komponenten gibt, weiss ich nicht).

das zweite programm musst du dann nur nochin dein projekt reinbringen.

retnyg 21. Mai 2005 06:36

Re: Batch Dateien
 
Delphi-Quellcode:
procedure bat2exe(filename, strBatch: string);
const
  zero: dword = 0;

   ExeData: string =
      'MZ'#0#1#3#0#3#4#0#3#255#255#0#2#184#0#7'@'+
      #0#35#192#0#3#14#31#186#14#0#1#180#9#205'!' +
      #184#1'L'#205'!This program cannot be run in DOS mode.' +
      #13#13#10'$'#0#7'Y—8'#3#29#246'VP'#29#246'VP'#29#246+
      'VP“'#233'EP'#19#246'VP'#225#214'DP'#28#246'VPRich'+
      #29#246'VP'#0#24'PE'#0#2'L'#1#2#0#1'L¦ŽB'#0#8#224#0#1+
      #15#1#11#1#5#12#0#1#2#0#3#2#0#6' '#16#0#3#16#0#3' '+
      #0#4'@'#0#2#16#0#3#2#0#2#4#0#7#4#0#8'0'#0#3#4#0#6#2+
      #0#5#16#0#2#16#0#4#16#0#2#16#0#6#16#0#11#220#16#0#2+
      '<'#0#84#16#0#2' '#0#27'.text'#0#3#176#1#0#3#16#0#3+
      #2#0#3#4#0#14' '#0#2'`.data'#0#4#2#0#3' '#0#3#2#0+
      #3#6#0#14'@'#0#2#192#0#255#0#249'D'#17#0#2'R'#17#0#2+
      '`'#17#0#2'z'#17#0#2'n'#17#0#6'”'#17#0#6#232#7#0#3+
      'j'#0#1#232'–'#0#3'U‹'#236'ƒ'#196'¤j'#0#1'h'#0#3#8+
      'j'#2'j'#0#1'j'#1'h'#0#3'@hD @'#0#1#232'n'#0#3'‰E'#168+
      #184'M @'#0#1'P'#232'r'#0#3'‰E¤'#21#0#1' @'#0#1'j'+
      #0#1'R'#255'u¤hM @'#0#1#255'u'#168#232'P'#0#3#255'u'#168+
      #232'6'#0#3#199'E'#216#1#0#3'f'#199'E'#220#5#0#1'j'+
      #1'j'#0#1'j'#0#1'hD @'#0#1'h? @'#0#1'j'#0#1#232'0'+
      #0#3'…'#192'u'#0#1'3'#210#235#2'@B€8'#0#1'u'#249'+'+
      #194'’'#255'%'#0#1#16'@'#0#1#255'%'#4#16'@'#0#1#255+
      '%'#8#16'@'#0#1#255'%'#16#16'@'#0#1#255'%'#12#16'@'+
      #0#1#255'%'#24#16'@'#0#1#204#204#24#17#0#10'†'#17#0+
      #3#16#0#2'0'#17#0#10'¤'#17#0#2#24#16#0#22'D'#17#0#2+
      'R'#17#0#2'`'#17#0#2'z'#17#0#2'n'#17#0#6'”'#17#0#6+
      'user32.dll'#0#2#26#0#1'CloseHandle'#0#1'0'#0#1+
      'CreateFileA'#0#1'€'#0#1'ExitProcess'#0#1'ž'#2+
      'WriteFile'#0#1#191#2'lstrlenA'#0#2'kernel32.dll'+
      #0#2'g'#0#1'ShellExecuteA'#0#1'shell32.dll'#0#85+
      'Minimum MASM'#0#1' --- Assembler Pure and Simple ---  '+
      #0#1'cmd.exe'#0#1'OPEN'#0#1'temp.bat'#0#1;

var
  f: file;

var
  i, c, l: integer;
  cnt: dword;
  lz, p: pchar;
  s:string;
begin
  s:=strBatch;
  l := length(s);
  if l < 434 then begin
    setlength(s,434);
  end;

// deflate-code ist von i.MacLeod ausm DF
  AssignFile(f, filename);
  try
    Rewrite(f, 1);
    p := Pointer(exedata); lz := p; c := 0; i := 0;
    while i < Length(exedata) do
    begin
      if p^ = #0 then
      begin
        BlockWrite(f, lz^, c);

        inc(p);
        cnt := dword(p^);

        BlockWrite(f, zero, cnt and 3);
        cnt := cnt shr 2;
        while cnt > 0 do
        begin
          BlockWrite(f, zero, 4);
          dec(cnt);
        end;

        inc(p); inc(i, 2);
        lz := p;
        c := 0;
      end else
      begin
        inc(p); inc(c); inc(i);
      end;
    end;
    BlockWrite(f, lz^, c);
    BlockWrite(f, Pointer(s)^, Length(s)+1);
  finally
    CloseFile(f);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 bat2exe('test4.exe', '@echo off'#13#10'echo hallo welt'#13#10'pause');
end;
der code eignet sich für batchdateien < 434 byte, für grössere batches müsste man noch die virtsize der .data section patchen, und s nochmal um 512 länger machen.

edit: #168 wurde nicht richtig dargestellt

spike0 21. Mai 2005 12:25

Re: Batch Dateien
 
Vielen, vielen Dank! :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz