Entwickler-Ecke

Sonstiges (Delphi) - Zwei Programme in einem zusammenfassen


daywalker0086 - Do 22.05.14 22:44
Titel: Zwei Programme in einem zusammenfassen
Moin Moin,
Ich habe eine Frage zur Vorgehensweise.
Ich habe ein erstes Programm geschrieben, anschließend ein zweites.
Nun möchte ich das zweite irgendwie in dem ersten integrieren und das Hauptformular der zweiten Anwendung über einen Button in der ersten Anwendung aufrufen.
Hintergrund der ganzen Sache: Am Anfang sollte ein Programm zum programmieren von Geräten programmiert werden. Später sollte ein Programm geschrieben werden mit welchem man die Geräte testen kann. Nun könnte ich einfach die Units des zweiten in das erste integrieren aber in Zukunft soll es Gerätespezifisch jeweils eine neue Testsoftware geben und ich will ungern immer das komplette Programm austauschen. Ich stelle mir das eher so vor, dass das Programm in einen Ordner nach den Unterprogrammen schaut und dann quasi dynamisch jeweils einen Button für das Programm anzeigt, quasi wie Apps auf dem Handy ;).
Wie kann man das am besten mit delphi umsetzen? noch kann ich beide Programme ohne Aufwand umstricken.

Habt ihr da Vorschläge?

Grüße Christian


ChrisCross - Fr 23.05.14 06:54

Hallo,

wenn ich dich richtig verstanden habe, nimm doch einfach die .exe Datei deiner Testsoftware und packe sie in einen Unterordner von deinem anderen Programm. Folgenden Code fügst du bei deinem Button ein:

ShellExecute(Application.Handle, 'open', PChar('Verzeichnis\Testsoftware.exe'), nilnil, SW_NORMAL); und passt den Pfad an. Bei Buttonklick sollte sich das andere Programm öffnen.


rushifell - Fr 23.05.14 07:17

Hallo,

eine einfache Lösung wäre z.B. mit CreateProcess.

Hier ein Beispiel:


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:
function ExecAndWait(const FileName: stringconst CmdShow: Integer): Longword;
var { by Pat Ritchey }
  zAppName: array[0..512of Char;
  zCurDir: array[0..255of Char;
  WorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  AppIsRunning: DWORD;
begin
  StrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb          := SizeOf(StartupInfo);
  StartupInfo.dwFlags     := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := CmdShow;
  if not CreateProcess(nil,
    zAppName, // pointer to command line string
    nil// pointer to process security attributes
    nil// pointer to thread security attributes
    False, // handle inheritance flag
    CREATE_NEW_CONSOLE or // creation flags
    NORMAL_PRIORITY_CLASS,
    nil//pointer to new environment block
    nil// pointer to current directory name
    StartupInfo, // pointer to STARTUPINFO
    ProcessInfo) // pointer to PROCESS_INF
    then Result := WAIT_FAILED
  else
  begin
    while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do
    begin
      Application.ProcessMessages;
      Sleep(50);
    end;

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end;
end{ WinExecAndWait32 }

Es wird solange gewartet, bis Du die entsprechende Anwendung wieder schließt.

... oder einfach hier im Forum nach CreateProcess suchen. ShellExecute sollte man zum Starten von exe-Dateien eigentlich nicht verwenden, auch wenn es funktioniert.

Eine weitere Möglichkeit wäre über eine Art Plugin System mit DLL's.

Hier mal ein Beispiel, wie man Formulare in DLL's nutzt.
http://www.michael-puff.de/Programmierung/Delphi/Code-Snippets/FormInDLL.shtml

Letzteres hab ich selbst jedoch noch nie ausprobiert.


daywalker0086 - Fr 23.05.14 09:16

Guten morgen und danke für die Anregungen.
Kann ich beim Create Prozess noch variablen übergeben?
Geht das nur über ParamStr oder auch anders? Kann man auch Variablen aus dem Unterprogramm an das Hauptprogramm übergeben?


rushifell - Fr 23.05.14 16:59

Ich selbst nutze zum Datenaustausch Memory Mapped Files (MMF). Damit kannst Du auch größere Datenmenge problemlos zwischen den Programmen austauschen. Einfach mal danach suchen. Das Erstellen, Lesen und Schreiben von MMF ist sehr einfach. Du musst nur darauf achten, dass nicht gleichzeitig ein Programm liest und das andere schreibt. Natürlich kannst Du auch die Variablen als Parameter übergeben (einfach an FileName dranhängen).

Viele Grüße