Announcement

Collapse
No announcement yet.

Eigenen Prozess aus Delphi-EXE

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eigenen Prozess aus Delphi-EXE

    Hey Leute

    Ich habe folgendes Problem: Bei meinem Dateimanager gibt es die Möglichkeit einen Dateiviewer aufzurufen. Dieser zeigt sowohl alle Textformate als auch alle Grafikformate an. Ich möchte nun diesen Viewer als eigenen Prozess starten, der unabhängig von dem Dateimanager-Prozess läuft. Ich habe es bereits als Thread versucht, jedoch wäre ich dabei auf etwa 16 Prozesse begrenzt ( bei Win95 noch weniger ) und ich kann zwischen den Threads nicht mir CTRL-TAB umschalten.
    Ich hoffe ihr könnt mir helfen.

  • #2
    Hm

    Such nach ShellExecute(), ShellExecuteEx(), WinExec(), CreateProcess(). Was Dein problem mit abgespalteten Thread in dem Dateiverwalter zu tun hat weiß ich allerdings nicht.

    Gruß hage

    Comment


    • #3
      Hi Hagen

      Habe mich wahrscheinlich wieder mal nicht richtig ausgedrückt. Main Problem ist, daß mit ShellExecute(ex), CreateProcess usw. zwar ein neuer Prozess erzeugt wird, aber nur für eine weitere vorhandene Exe-Datei. Ich will jedoch aus der Exe-Datei meines Dateiverwalters, zur Leufzeit, ein Objekt erzeugen (meinen Dateiviewer) und das Handle dieses Objektes einem neuen Prozess übergeben. Dadurch kann ich beliebig viele Prozesse starten (und auch zwischen den Prozessen wechseln).
      Ich weiß nicht ob du den Windows Commander von Christian Giessler kennst. Dessen Dateibetrachter ist auch ein Objekt das einem neuen Prozess übergeben wird.
      Hoffe ich habe mich diesmal klarer ausgedrückt. Vielleicht kennst du eine Methode

      Comment


      • #4
        Hi

        Deine EXE implementiert den dateiviewer als COM Interface. Die kleineren Prozess-EXE'en laden dann über das COM Interface immer den identischen dateiviewer. So ähnlich arbeitet der Windows-Explorer, eine globale Instance fungiert als Shell und jeder weitere Explorer kann ein eigener prozess sein der nur auf die Shell-Exploerer-Instance und deren COM-Objecte zugreift.

        Vielleicht wird sich ja Andreas mal mit Deiner Frage beschäftigen, dem fällt bestimmt noch was ein.

        Gruß hage

        Comment


        • #5
          Hallo,

          ein Prozess ist unter Win32 immer ein unabhängiger virtueller Adressraum, so dass ein neuer Prozess immer mit einem "externen Programm" (genauer gesagt mit einer zweiten Programminstanz) verbunden ist (da die Frage parallel als eMail direkt zugeschickt wurde und dort das Problem ausführlicher geschildert wurde, beantworte ich hier die in der eMail gestellten Fragen).
          Es wäre die reinste Ressourcenverschwendung, wenn für den Dateibetrachter eine Kopie (Clone) des eigenen Programm neu gestartet wird. Statt dessen ist es sinnvoll, den Dateibetrachter entweder

          a) als eigene EXE, die vom Programm aufgerufen (CreateProcess) wird bzw. als Local Server (COM-Objekt, dessen Instanz vom eigenen Programm angefordert wird),

          oder

          b) als nichtmodales Formular, das beliebig oft aus dem eigenen Programm heraus aufgerufen wird,

          zu implementieren. Wenn es nur darum geht, relativ unabhängige und über CRTL+TAB umschaltbare Fenster für den Dateiviewer zu erhalten, ist die Version b) am Besten geeignet. Das könnte zum Beispiel so aussehen:
          <pre>
          { ************************************************** *******************
          Autor : Andreas Kosch
          Compiler : Delphi 5 UpdatePack#1
          Betriebssystem : Windows 2000
          Beschreibung : Fenstersteuerungs-Möglichkeiten:
          a) Hauptformular steuert nichtmodale Formulare
          (wird das Hauptformular abgelegt, so werden
          als Vorgabewert auch alle nichtmodalen Formulare
          in der Taskbar abgelegt)
          b) Nicht-modalen Formulare können völlig unabhängig
          vom Hauptformular abgelegt/aufgerufen werden.
          ************************************************** ******************** }

          unit FensterSteuerungFrm;

          interface

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

          type
          TFormMain = class(TForm)
          Button2: TButton;
          Button3: TButton;
          CheckBoxMain: TCheckBox;
          StatusBar1: TStatusBar;
          procedure Button2Click(Sender: TObject);
          procedure Button3Click(Sender: TObject);
          procedure FormCreate(Sender: TObject);
          private
          { Private-Deklarationen }
          FDesktopWindow : HWND;
          public
          { Public-Deklarationen }
          property DesktopWindowHandle: HWND read FDesktopWindow;
          end;

          var
          FormMain: TFormMain;

          implementation

          {$R *.DFM}

          uses FensterSteuerungFrm2, FensterSteuerungFrm3;

          procedure TFormMain.FormCreate(Sender: TObject);
          begin
          FDesktopWindow := GetDesktopWindow;
          end;

          procedure TFormMain.Button2Click(Sender: TObject);
          begin
          with TForm2.Create(self) do
          Show;
          end;

          procedure TFormMain.Button3Click(Sender: TObject);
          begin
          with TForm3.Create(self) do
          Show;
          end;

          end.
          </pre>
          2. Formular:
          <pre>
          unit FensterSteuerungFrm2;

          interface

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

          type
          TForm2 = class(TForm)
          procedure FormClose(Sender: TObject; var Action: TCloseAction);
          private
          { Private-Deklarationen }
          public
          { Public-Deklarationen }
          procedure CreateParams(var Params: TCreateParams); override;
          end;

          var
          Form2: TForm2;

          implementation

          {$R *.DFM}

          { TForm2 }

          uses FensterSteuerungFrm;

          procedure TForm2.CreateParams(var Params: TCreateParams);
          begin
          inherited CreateParams(Params);
          Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
          if FormMain.CheckBoxMain.Checked then
          Params.WndParent := FormMain.DesktopWindowHandle;
          end;

          procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
          begin
          Action := caFree;
          end;

          end.
          </pre>
          3. Formular:
          <pre>
          unit FensterSteuerungFrm3;

          interface

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

          type
          TForm3 = class(TForm)
          procedure FormClose(Sender: TObject; var Action: TCloseAction);
          private
          { Private-Deklarationen }
          public
          { Public-Deklarationen }
          procedure CreateParams(var Params: TCreateParams); override;
          end;

          var
          Form3: TForm3;

          implementation

          {$R *.DFM}

          uses FensterSteuerungFrm;

          { TForm3 }

          procedure TForm3.CreateParams(var Params: TCreateParams);
          begin
          inherited CreateParams(Params);
          Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
          if FormMain.CheckBoxMain.Checked then
          Params.WndParent := FormMain.DesktopWindowHandle;
          end;

          procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
          begin
          Action := caFree;
          end;

          end.
          </pre>

          P.S: Ich bitte darum, nicht jede Forum-Frage parallel als eMail direkt zu schicken, mein Posteingang ist auch so voll genug

          Comment


          • #6
            Hm, aber man könnte auch solche Funktionalität als COM Interface in einer DLL implementieren. Dann kann der Main-Prozess und die kleineren Child Prozesse (Dateiviewer) diese DLL doch gemeinsam nutzen ?

            Natürlich ist es einfacher das Form mehrmals zu erzeugen.

            Gruß Hage

            Comment


            • #7
              Hallo Hagen,

              ja - das geht auch. Es ist nur eine Abwägung zwischen Aufwand und Nutzen (bzw. der "Gefährlichkeit" für die Systemstabilität)

              Comment

              Working...
              X