Autor Beitrag
F.Art
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: So 12.01.03 21:05 
Ich möchte eine fremde EXE in meine mit einbringen möchte aber keine EXE joiner benutzen sondern das selbst ein binden.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 21:49 
Zitat:
Eine Datei in einer Applikation einbinden und sie ausführen.

Autor: Thomas Stutz << Homepage: www.swissdelphicenter.ch >>

1. Starte Notepad und erstelle ein .rc-file, das etwa so aussieht:

TESTFILE EXEFILE C:\Windows\Notepad.exe

(Stelle sicher, dass der Pfad zur Exe-Datei korrekt ist!)

2. Speichere es als myres.rc

3. Kompiliere die Datei mit brcc32.exe

(Im Delphi-bin Verzeichnis) um die Datei myres.res zu erhalten.

4. Kopiere myres.res in das entsprechende Projekt-Verzeichnis.

usw ...
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: So 12.01.03 22:38 
ich habe das leider nicht ganz geschnallt, geht das vieleicht etwas ausführlicher
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 23:01 
Wo ist das Problem?
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: So 12.01.03 23:09 
mit notepad eine datei erstellen namens test.rc
in die datei den text (TESTFILE d:\generieren.exe C:\Windows\Notepad.exe)
?????
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.01.03 08:12 
@Popov: Warum gibst du ihm nicht wemfalls den kompletten Link?
www.swissdelphicente.../showcode.php?id=594

@F.Art. Wenn du das jetzt nicht verstehest, dann wird es echt schwer, für dich, wie auch für uns es dir zu erklöären.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.01.03 08:19 
Luckie hat folgendes geschrieben:
@Popov: Warum gibst du ihm nicht wemfalls den kompletten Link?


Weil ich den Tip mal selbst umgesetzt habe und dabei auch die Anleitung als Kommentar mit gepackt habe. Das Zitat ist also aus meiner Unit kopiert und nicht von der Webpage.
Dargor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 59

Win2k SP4, WinXP Pro SP1
D6 Pers
BeitragVerfasst: Mo 13.01.03 08:21 
Also, wenn man dem Link folgt, wird zwar sehr ausführlich beschrieben, wie man ein EXE-Datei in eine EXE-Datei einbindet und diese dann ausführt, aber wie sieht das ganze aus, wenn ich die eingebundene Datei mit Parametern aufrufen will (analog zum winexec-Befehl)?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.01.03 08:25 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
typedef struct _SHELLEXECUTEINFO {
    DWORD cbSize;
    ULONG fMask;
    HWND hwnd;
    LPCTSTR lpVerb;
    LPCTSTR lpFile;
    LPCTSTR lpParameters;
    LPCTSTR lpDirectory;
    int nShow;
    HINSTANCE hInstApp;
    LPVOID lpIDList;
    LPCTSTR lpClass;
    HKEY hkeyClass;
    DWORD dwHotKey;
    union {
        HANDLE hIcon;
        HANDLE hMonitor;
    }
 DUMMYUNIONNAME;
    HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

Noch Fragen? :roll:

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.01.03 08:30 
Dargor hat folgendes geschrieben:
..., aber wie sieht das ganze aus, wenn ich die eingebundene Datei mit Parametern aufrufen will [...]?


Das ist nur packen und entpacken. Der Rest ist wie gehabt.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 13.01.03 08:40 
F.Art hat folgendes geschrieben:
mit notepad eine datei erstellen namens test.rc
in die datei den text (TESTFILE d:\generieren.exe C:\Windows\Notepad.exe)
?????

Warum schreibst Du das mit c:\Windows\Notepad.exe dort hin? In der o. geposteten Anleitung wird der Notepad nur als Beispiel benutzt. Du hast ja schon Deine Anwendung mit d:\generieren.exe angegeben. Also pack den link zum Notepad weg!

Gruß
TINO
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mo 13.01.03 15:48 
Habe noch irgendwie probleme und folgendes habe ich fabriziert.

mit einem texteditor habe ich myres.rc file im verzeichnis meines projectes erstellt. und folgendes alt text eingetragen 'beide.exe fremde.exe '
dann habe ich die brcc32.exe mit in das projectverzeichnis kopiert und bin über dos dorthin gesprungen.
dann habe ich Brcc32.exe –32 @<myres.rc> myres.res eingegeben und habe eine myres.res datei bekommen.

dann habe ich diesen source benutzt
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  NOTEPAD_FILE: string;
implementation

{$R *.dfm}
{$R MYRES.RES}

function GetTempDir: string; 
var 
  Buffer: array[0..MAX_PATH] of Char; 
begin
  GetTempPath(SizeOf(Buffer) - 1, Buffer);
  Result := StrPas(Buffer);
end; 

// Extract the Resource 
function ExtractRes(ResType, ResName, ResNewName: string): Boolean; 
var 
  Res: TResourceStream; 
begin
  Result := False;
  Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType));
  try 
    Res.SavetoFile(ResNewName); 
    Result := True; 
  finally 
    Res.Free; 
  end; 
end;

// Execute the file 
procedure ShellExecute_AndWait(FileName: string); 
var 
  exInfo: TShellExecuteInfo;
  Ph: DWORD; 
begin
  FillChar(exInfo, SizeOf(exInfo), 0); 
  with exInfo do
  begin 
    cbSize := SizeOf(exInfo); 
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; 
    Wnd := GetActiveWindow(); 
    ExInfo.lpVerb := 'open'; 
    lpFile := PChar(FileName); 
    nShow := SW_SHOWNORMAL; 
  end; 
  if ShellExecuteEx(@exInfo) then
  begin 
    Ph := exInfo.HProcess; 
  end 
  else 
  begin 
    ShowMessage(SysErrorMessage(GetLastError)); 
    Exit; 
  end; 
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages; 
  CloseHandle(Ph); 
end; 

// To Test it 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if ExtractRes('fremde.exe', 'beide.exe', NOTEPAD_FILE) then
    if FileExists(NOTEPAD_FILE) then
    begin 
      ShellExecute_AndWait(NOTEPAD_FILE); 
      ShowMessage('Notepad finished!'); 
      DeleteFile(NOTEPAD_FILE); 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin
  NOTEPAD_FILE := GetTempDir + 'Notepad_FROM_RES.EXE'; 
end;

end.

dann compeliert und folgendes kam dann

Zitat:
[Hint] Unit1.pas(39): Value assigned to 'ExtractRes' never used


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.01.03 16:26 
F.Art hat folgendes geschrieben:
und folgendes alt text eingetragen 'beide.exe fremde.exe '


Es scheint ja unheimlich schwer zu sein diese Zeile:
ausblenden Quelltext
1:
TESTFILE EXEFILE C:\Windows\Notepad.exe					

An deine Bedürfnisse anzu passen. :roll:
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.01.03 16:26 
Zuerst: packe bitte in Zukunft deine Delphi-Codes in die Code-Tags. Einfach oben Code-Button klicken, Code einfügen, Button ein zweites mal zum schließen klicken.

Bitte beachte auch was in der Anleitung steht:

Zitat:
TESTFILE EXEFILE C:\Windows\Notepad.exe


Das was du erstellst ist eine Ressorce. Wenn du also den oberen Text eingibst, dann ist das so:

TESTFILE ist der String und ist der Ressorce-Typ (HInstance). Der Ressorce-Typ hat also die Bezeichnung "TESTFILE". Du kannst auch eine andere Bezeichnung wählen, z.B. "FILE". Später greifts du über die Bezeichnung auf die Ressorce zu.

EXEFILE ist der String und ist der Ressorce-Name (Resname). Der Ressorce-Name hat also die Bezeichnung "EXEFILE". Du kannst auch eine andere Bezeichnung wählen, z.B. "MY_EXEFILE". Später greifts du über die Bezeichnung auf die Ressorce.

Irgendwann mußt du die Ressorce dann extrahieren (z.B. mit der Funktion im Beispiel "ExtractRes") . Dann ist es eine gute Idee auf die vielen Ressorcen über die Typ-Bezeichnung und den Namen der Ressorce zuzugreigen. :

ausblenden Quelltext
1:
ExtractRes('TESTFILE', 'EXEFILE', 'c:\temp\testprogramm.exe');					


Und schon hast du die Datei extrahiert. Der Rest ist wie gehabt. Du hast eine Datei im Tempverzeichnis und kannst sie starten wie du willst.

Also ich hab nicht gedacht, daß du das Beispiel übernimmst ohne dir auch die Funktionen zumindes anzugucken. Dann hättest du auch verstanden um was es geht.

PS: Natürlich muß du die Resorce auch in deinem Programm vorher einkompilieren.

ausblenden Quelltext
1:
{$R die_zweite_exe.res}					
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mo 13.01.03 17:51 
was soll [Error] RLINK32: Unsupported 16bit resource in file "myres.res" bedeuten?

So wie ich das sehe wird das ins temp abgespeichert kann man das nicht ins ram speichern und steuern?
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.01.03 18:31 
Was hällst du davon in Zukunft gleich bei der ersten Frage deine besonderen Wünsche mitzuteilen. Viele Leute könnten sich dann unnötige Antworten sparen und würdest schneller die passende Antwort kriegen.
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mo 13.01.03 19:07 
das war ne überlegun die erst später kam.
ich versuche delphi zu lernen und habe halt regelmäsig ideen die ich umsetzen möchte.
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Do 16.01.03 14:42 
ich habs nochmal versucht aber da kommt immer noch ein anderer fehler.

[Hint] Unit1.pas(42): Value assigned to 'ExtractRes' never used
[Error] RLINK32: Unsupported 16bit resource in file "D:\exe-test\myres.res"

er springt in diese Zeile
ausblenden Quelltext
1:
NOTEPAD_FILE := GetTempDir + 'Notepad_FROM_RES.EXE';					


Was habe ich diesmal falsch gemacht?
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: So 15.06.03 19:25 
Ich habe nun die myres.res im Project mit drinnen.
Wie starte ich diese und lasse es steuern?
Es ist ein DOS programm mit Parameter eingabe.
Es sollte auch im Speicher ausgeführt werden und nicht auf HD gespeichert.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 15.06.03 20:29 
Also, im SDC sthet Code, den man per Copy and Paste in sein programm übernehmen kann. Das einzigeste, was man anpassen muß ist die Ressource. Dazu sage ich jetzt nichts mehr. :roll:

Und zu den Parametern kuck dir mal die Struktur von SHELLEXECUTEINFO an, die ich oben gepostet habe. Darauf habe ich dich übrigens schon mal hingewiesen.

Im Speicher ausführen geht nur unter NT-basierenden Systemen. Dazu habe ich auch Sourcecode, aber wenn du schon nicht in der Lage bist den Code vom SDC zu benutzen, dann wird dir das erst recht nichts nützen.