AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bestehende Anwendung in dll wandeln

Ein Thema von Bemo · begonnen am 28. Sep 2006 · letzter Beitrag vom 6. Okt 2006
Antwort Antwort
Bemo

Registriert seit: 28. Sep 2006
11 Beiträge
 
Delphi 7 Professional
 
#1

Bestehende Anwendung in dll wandeln

  Alt 28. Sep 2006, 12:11
Hallo zusammen,
ich stehe vor der Aufgabe, eine bestehende Anwendung in eine dll umzuwandeln, die aus einem C-Programm (ja, ja ich weiß.... , 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

Grüße Bernd
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Bestehende Anwendung in dll wandeln

  Alt 28. Sep 2006, 12:13
Zeig mal kurz wie du bisher vorgegangen bist. (Wrapper)
Markus Kinzler
  Mit Zitat antworten Zitat
Bemo

Registriert seit: 28. Sep 2006
11 Beiträge
 
Delphi 7 Professional
 
#3

Re: Bestehende Anwendung in dll wandeln

  Alt 28. Sep 2006, 15:22
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]
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Bestehende Anwendung in dll wandeln

  Alt 28. Sep 2006, 17:39
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Bestehende Anwendung in dll wandeln

  Alt 28. Sep 2006, 18:31
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Bemo

Registriert seit: 28. Sep 2006
11 Beiträge
 
Delphi 7 Professional
 
#6

Re: Bestehende Anwendung in dll wandeln

  Alt 29. Sep 2006, 11:53
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 , 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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#7

Re: Bestehende Anwendung in dll wandeln

  Alt 29. Sep 2006, 12:05
Zitat von Bemo:
"Pack das Laden der DLL einfach in einen Thread" ich weiß jetzt noch nicht genau wie das ausprogrammiert wird , 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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Bemo

Registriert seit: 28. Sep 2006
11 Beiträge
 
Delphi 7 Professional
 
#8

Re: Bestehende Anwendung in dll wandeln

  Alt 30. Sep 2006, 13:50
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
  Mit Zitat antworten Zitat
Bemo

Registriert seit: 28. Sep 2006
11 Beiträge
 
Delphi 7 Professional
 
#9

Re: Bestehende Anwendung in dll wandeln

  Alt 6. Okt 2006, 12:05
Hallo zusammen,

also der Hinweis mit dem Tread war gold wert. Vielen Dank. 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 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