Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prism Externe Anwendung auf das eigene Programm legen? (https://www.delphipraxis.net/99403-externe-anwendung-auf-das-eigene-programm-legen.html)

Alexander 11. Sep 2007 19:30


Externe Anwendung auf das eigene Programm legen?
 
Hallo :),
ich habe mit C# (.NET 2.0) eine Komponente geschrieben. Diese möchte ich auch gerne in einer Delphi.NET Anwendung verwenden (.NET 1.1). Aufgrund der unterschiedlichen .NET Version klappt das ja nicht.

Meine Idee war jetzt folgende:
Ich bastel nen kleines Programm um die Komponente (mit C#) und starte das Programm in meiner Delphi.NET Anwendung (.NET 1.1).
Dann habe ich mir überlegt, könnte ich ja einfach mit der Win32API Funktion SetParent die Handles umbiegen und so die Anwendung in die Delphi-Anwendung bekommen. Dazu erstelle ich mir eine Form, auf die dann die Anwendung angezeigt werden soll.

Gesagt getan:
Testweise starte ich erstmal den Taschenrechner.
Delphi-Quellcode:
   TProcessHelper = class
  private
    [DllImport('"user32.dll')]
    class function SetParent(hWndChild : IntPtr; hWndNewParent : IntPtr) : IntPtr; static;
  {...}
procedure loadProcess();
var
   p : Process;
   frm : Form;
begin
  frm := Form.Create();
  frm.Owner := _parent;
  frm.ShowInTaskbar := false;

  p := Process.Create();
  p.StartInfo.FileName := 'calc.exe';
  include(p.Exited, p_Exited); // nur damit das Form auch wieder geschlossen werden kann.
  p.Start();

  SetParent(p.MainWindowHandle, frm.Handle);
  frm.ShowDialog();
end;
Leider kommt sobald ich mit der Maus auf den Taschenrechner oder meine Anwendung klicke die Fehlermeldung:
Zitat:

"Die DLL user32.dll kann nicht geladen werden."
Woran kann das liegen ?
Vielleicht fällt euch ja auch noch eine etwas elegantere Möglichkeit ein, die Anwendung in das Delphi-Programm zu integrieren?

Besten Dank,
Alexander

Khabarakh 11. Sep 2007 19:44

Re: Externe Anwendung auf das eigene Programm legen?
 
Ist das zusätzliche Anführungszeichen im Attribut beim Kopieren reingerutscht? Ich hoffe nicht, denn einen anderen Fehler kann ich nicht erkennen.

Alexander 12. Sep 2007 13:41

Re: Externe Anwendung auf das eigene Programm legen?
 
Oha, das wirklich ein Fehler :oops:. Leider klappt es aber nicht so, wie ich mir das gedacht habe.
Bzw. es ist Zufall, ob es klappt oder nicht. Mal klappt es, dann wieder nicht.

Ich habe mir da jetzt noch etwas anderes überlegt.
Ich lasse die Anwendung einfach modal anzeigen, indem ich den Prozess in einem nicht sichtbaren, aber modal geladenen Form starte.
Das klappt recht gut. Auch wenn der Lösungsweg schon recht schräg ist :P. Aber so weit ich weiß, gibt es keine Möglichkeit diese Prozesse modal anzuzeigen (also wie bei ShowDialog einer Form).

Wenn du noch eine Idee hast, woran es liegen kann. Dann nur her damit :P

Khabarakh 12. Sep 2007 17:28

Re: Externe Anwendung auf das eigene Programm legen?
 
Was passiert denn, wenn es mal "nicht klappt"? Ist dein code vielleicht einfach zu schnell und das Fenster noch nicht erstellt?

Achja, nur so am Rande: welcher böse Mensch zwingt dich zu 1.1 :stupid: ?

Alexander 13. Sep 2007 09:29

Re: Externe Anwendung auf das eigene Programm legen?
 
Zitat:

Zitat von Khabarakh
Was passiert denn, wenn es mal "nicht klappt"? Ist dein code vielleicht einfach zu schnell und das Fenster noch nicht erstellt?

Der gestartete Prozess will einfach nicht in meine Anwendung rein ;). Sprich, das erzeugte Fenster bleibt so, wie es ist.
Mehr weiß ich leider auch nicht. Es kann gut sein, dass es ein Problem mit der Schnelligkeit ist. Das kann ich leider aber nicht nachvollziehen.

Zitat:

Achja, nur so am Rande: welcher böse Mensch zwingt dich zu 1.1 :stupid: ?
:oops:. Ja, .Net 2 ist schon wesentlich angenehmer, daher habe ich auch das eine (Teil-)Projekt mit C# in 2.0 geschrieben und wollte es so einbinden. Das eigentliche Problem ist aber, dass ich mein Projekt in Delphi (1.1) begonnen habe und es zu viel Arbeit wäre, alles wieder umzuschreiben (~50 000 Zeilen). Alles was ich neu geschrieben habe und irgendwie vom eigentlich Projekt trennen kann, schreibe ich auch nicht mehr in .NET 1.1.
Chrome wäre sicherlich eine Alternative, habe es aber derzeit nur in einer Studentenversion ;).

Khabarakh 13. Sep 2007 12:14

Re: Externe Anwendung auf das eigene Programm legen?
 
Zitat:

Zitat von Alexander
Das kann ich leider aber nicht nachvollziehen.

Versuch es doch einfach einmal mit einem Thread.Sleep(5000) zwischen Start und SetParent.

Zitat:

(~50 000 Zeilen)
Ok, das ist ein Grund :shock: . Eigentlich müsstest du ja nur die äußerste GUI (und alle weiteren Teile, die du mit C# aufstocken willst) nach 2.0 konvertieren (C#-to-D.Net gibt es ja sogar von Borland/CG, einen kostenlosen Konverter in die andere Richtung habe ich leider nocht nicht gesehen :gruebel:), aber bei 50000 LOC dürfte das trotzdem ein wenig Arbeit sein. Du musst eben erwägen, welcher Weg der längere und steinigere sein wird ;) .


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 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