Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bestehende Anwendung in dll wandeln (https://www.delphipraxis.net/78055-bestehende-anwendung-dll-wandeln.html)

Bemo 28. Sep 2006 12:11


Bestehende Anwendung in dll wandeln
 
Hallo zusammen,
ich stehe vor der Aufgabe, eine bestehende Anwendung in eine dll umzuwandeln, die aus einem C-Programm (ja, ja ich weiß.... :oops: , aber so ist die Forderung) aufgerufen werden soll. Soweit alles klar. Ich habe mich an das DELPHI Kochbuch gewand und alle Antworten gefunden. ABER--- meine Anwendung benutzt zur Darstellung der einzelnen Formulare Form.ShowModal. Somit hat das aufrufende C Programm aber keine Chance mehr weiterzuarbeiten, da ich ab diesem Aufruf die alleinige Kontrolle beim Delphi Programm habe. Ein Aufruf der Delphi Formulare über Form.Show funktioniert nicht (habe ich ausprobiert) Kann mir irgendwer einen Tip geben ????. Ich komm nicht weiter :wall:

Grüße Bernd

mkinzler 28. Sep 2006 12:13

Re: Bestehende Anwendung in dll wandeln
 
Zeig mal kurz wie du bisher vorgegangen bist. (Wrapper)

Bemo 28. Sep 2006 15:22

Re: Bestehende Anwendung in dll wandeln
 
Ich habe meine Anwendung zunächst als dll compiliert und dann um folgende procedure erweitert, die als Initialisierung vom C-Programm gerufen wird:

Delphi-Quellcode:
procedure Initialize(pos_x,pos_y:integer);stdcall;
  var
    start:boolean;
begin
  start:=true;
  F10Msge   := TF10Msge.Create(Application);
  F27End    := TF27End.Create(Application);
  SerKomWin := TSerKomWin.Create(Application);
  F02Key    := TF02Key.Create(Application);
  F35Wait   := TF35Wait.Create(Application);
  F03SetOp  := TF03SetOp.Create(Application);
  F31Vol    := TF31Vol.Create(Application);
  F37AirExt := TF37AirExt.Create(Application);
  F13Wrk1    := TF13Wrk1.Create(Application);
  F12Ped    := TF12Ped.Create(Application);
  F04Direct := TF04Direct.Create(Application);
  F11Para   := TF11Para.Create(Application);
  F19Test   := TF19Test.Create(Application);
  F18OPE    := TF18OPE.Create(Application);
  F08CStore := TF08CStore.Create(Application);
  F09Change := TF09Change.Create(Application);
  F15Move   := TF15Move.Create(Application);
  F20Copy   := TF20Copy.Create(Application);
  F06OptSys := TF06OptSys.Create(Application);
  F17YesNo  := TF17YesNo.Create(Application);
  F16SelfTest:= TF16SelfTest.Create(Application);
  F05Option := TF05Option.Create(Application);
  F07DirSurg := TF07DirSurg.Create(Application);
  F21Info   := TF21Info.Create(Application);
  F22Help   := TF22Help.Create(Application);
  F23PedStd := TF23PedStd.Create(Application);
  F24PedDisp := TF24PedDisp.Create(Application);
  F25OptUs  := TF25OptUs.Create(Application);
  F26Unbl   := TF26Unbl.Create(Application);
  F28MemSave := TF28MemSave.Create(Application);
  F29Mem    := TF29Mem.Create(Application);
  F30MemChg := TF30MemChg.Create(Application);
  F32Color  := TF32Color.Create(Application);
  F33Sensor := TF33Sensor.Create(Application);
  F34LeaveWrk:= TF34LeaveWrk.Create(Application);
  F36PedPara := TF36PedPara.Create(Application);
  F14Service := TF14Service.Create(Application);
  F01Start  := TF01Start.Create(Application);

  F01Start.Top     := pos_x;
  F01Start.Left    := pos_y;
  F27End.Top       := pos_x;
  F27End.Left      := pos_y;
  F03SetOp.Top     := pos_x;
  F03SetOp.Left    := pos_y;
  F03SetOP.Position := poDefault;
  F13Wrk1.Top      := pos_x;
  F13Wrk1.Left     := pos_y;
  F13Wrk1.Position := poDefault;
 
  try
    F01Start.ShowModal;
  finally
    F01Start.Release;
  end;
end;
Das Formular F01Start ist das Hauptfenster meines Delphi-Programms. Von hier aus verzweigt das Programm dann je nachdem noch auf andere Modal-Fenster. Die Parameter pos_x und pos_y geben dem C-Programm die Möglichkeit, das Delphi Programm auf dem Bildschirm zu positionieren, da die Delphi Applikation "kleiner" ist, als das C-Programm Formular.


Grüße

[edit=SirThornberry]Delphi-Tags gesetzt. Nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit]

shmia 28. Sep 2006 17:39

Re: Bestehende Anwendung in dll wandeln
 
Deine Aufgabenstellung ist gar nicht so einfach, wie das auf den 1. Blick aussieht.
Ein "normale" DLL kann nur ganz normale Funktionen/Prozeduren enthalten.
Klassen und Objekte gibt es erst mal nicht (zumindest, wenn Sprachübergreifend programmiert werden muss).
Also musst du den Kern, die Essenz deiner Anwendung rausziehen und als Funktionen in die DLL bringen.
Wenn die DLL Konfigurationsdaten benötigt, müssen diese aus der Registry oder einer INI-Datei gelesen werden.
Oder die Anwendung, die die DLL öffnet, muss diese Daten bereitstellen.
Auf diese Art werden keine Formulare innerhalb der DLL benötigt.

Deine Anwendung scheint ja über 20 Formulare zu enthalten.
Wahrscheinlich ist die eigentliche Aufgabe, deine Anwendung von Aussen programmierbar zu machen.
Dies nennt man im MS Jargon Automatisierung.
Wenn deine Anwendung automatisiert werden soll, dann geht die Idee mit der DLL in die ganz falsche Richtung.

SirThornberry 28. Sep 2006 18:31

Re: Bestehende Anwendung in dll wandeln
 
Das ganze ist einfacher als man denkt. Ein normales Exe-Programm hat wie eine DLL eine DPR als Einstiegspunkt. Somit brauchst du nur in der ersten zeile der Projektdatei "program" durch "library" ersetzen und schon ist es eine DLL nach dem kompilieren.
Zu deinem Problem mit dem ShowModal: Pack das Laden der DLL einfach in einen Thread und somit wird die DLL und das anzeigen dieses Forms darin im Context des Threads ausgeführt. Bzw. muss das nicht dich interessieren sondern ist sache desjenigen der deine DLL in sein C-Programm einbindet.

Wenn du es wie derzeit über deine Initialize-Funktion machen willst dann pack einfach den Inhalt der Funktion in einen Thread und starte in deiner Initialize-Funktion den Thread.

Bemo 29. Sep 2006 11:53

Re: Bestehende Anwendung in dll wandeln
 
Hallo und erstmal vielen Dank für das rege Interesse an meinem Problem

-also, @SirThornberry: "der ersten zeile der Projektdatei "program" durch "library" ersetzen und schon ist es eine DLL nach dem kompilieren" -> genau so bin ich auch vorgegangen.
"Pack das Laden der DLL einfach in einen Thread" ich weiß jetzt noch nicht genau wie das ausprogrammiert wird :oops: , aber ich werde diesen Weg testen und mich danach wieder hier melden. (über einen kurzen Source Code oder einen Link wäre ich dankbar, ich werde mich aber auch selbst mal auf die Suche machen.)

@shima: ich sehe ein, was Du meinst. ABER, auf diese Weise wäre es unmöglich, einer Anwendung über eine DLL ein Formular mitzugeben. Der Programmierer des C-Programms müsste dann ja meine Formulare "nachprogrammieren" und meine DELPHI DLL müsste diese Formulare dann über proceduren und funktionen mit "Leben" erfüllen.

Grüße und ich werde den Lösungsansatz über den thread weiterverfolgen und mich hier in eins zwei Tagen wieder melden

Bernd

Phoenix 29. Sep 2006 12:05

Re: Bestehende Anwendung in dll wandeln
 
Zitat:

Zitat von Bemo
"Pack das Laden der DLL einfach in einen Thread" ich weiß jetzt noch nicht genau wie das ausprogrammiert wird :oops: , aber ich werde diesen Weg testen und mich danach wieder hier melden. (über einen kurzen Source Code oder einen Link wäre ich dankbar, ich werde mich aber auch selbst mal auf die Suche machen.)

So wie ich das sehe gehst Du im C-Code jetzt her, lädst die DLL und Wuppdi™ blockiert Deine Anwendung wenn das Formular hochkommt, richtig?

Jo, wenn Du nicht direkt am Start das Formular mit ShowModal aufrufst sondern einen neuen Thread startest, der das dann macht, solltest Du fein raus sein.

Zu Threads schau mal hier: http://hsg.region-kaiserslautern.de/...eads/index.php

Und Luckie hat auf seiner eigenen Homepage glaub ich auch nochein Thread-Tutorial.

Bemo 30. Sep 2006 13:50

Re: Bestehende Anwendung in dll wandeln
 
Hallo,

ja, genau das ist mein Problem. Die C-Anwendung startet meine DLL und durch das ShowModal wird sie blockiert. Ich wurschtle mich durch die Thread Programmierung und werde auf jeden Fall meine Ergebnisse ( in zwei bis drei Tagen )posten.

Grüße Bernd

Bemo 6. Okt 2006 12:05

Re: Bestehende Anwendung in dll wandeln
 
Hallo zusammen,

also der Hinweis mit dem Tread war gold wert. Vielen Dank. :thumb: :dancer2: Prinzipell scheint es zu spielen. Ich habe noch zwei Probleme:
1. Ich teste die DLL mit einem kleinen DELPHI Programm. Wenn ich jetzt die Anwendung in der DLL schließe, ist alles ok. Wenn ich dann das aufrufende Programm beende, bekomme ich eine Fehlermeldung über einen Fehler im Fensterhandling.
2. Ich kann beim Aufruf meiner Anwendung in der DLL keine Aufrufparameter (Initialize Funktion) übergeben. Bis zum Thread.Create sind die Werte der Variablen noch ok, "in" der Anwendung sind die Werte dann 0. Vielleicht hat noch jemand einen Tip ????

Grüße Bernd


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