![]() |
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 |
Re: Bestehende Anwendung in dll wandeln
Zeig mal kurz wie du bisher vorgegangen bist. (Wrapper)
|
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:
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.
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; Grüße [edit=SirThornberry]Delphi-Tags gesetzt. Nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit] |
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. |
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. |
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 |
Re: Bestehende Anwendung in dll wandeln
Zitat:
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: ![]() Und Luckie hat auf seiner eigenen Homepage glaub ich auch nochein Thread-Tutorial. |
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 |
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 14:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz