Form aus einer dll heraus erstellen und Kontrolle an dieses Form übergeben?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Form aus einer dll heraus erstellen und Kontrolle an dieses Form übergeben?

    Hallo Zusammen,

    sorry für die etwas merkwürdige Überschrift aber eine bessere Umschreibung ist mir gerade nicht eingefallen. Das Thema dreht sich um Simatic WinAC und ODK. WinAC ist dabei eine Soft SPS die auf einem PC läuft und ODK eine Schnittstelle um Funktionen in anderen Programmiersprachen (u.a. auch VB) in das Steuerprogramm einzubinden. Das läuft über eine DLL deren Funktionen von WinAC aufgerufen werden. Das Projekt im Visual Studio (2008) erzeugt also eine Komponentenbibliothek.
    Ich möchte über die durch WinAC aufgerufene Funktion in der DLL ein Form anzeigen und einige Werte darstellen.
    Aktuell ist es so, dass ich ein Form im Designer erstellt habe, im Code eine Instanz davon erzeuge und es mit Show anzeige. Das funktioniert auch soweit. Das Problem ist nun dass die Funktion nach dem Show weiter läuft, dem WinAC signalisiert dass sie beendet wurde und auf dem Desktop ein nicht bedienbares Geisterform zurück bleibt. Die Funktionen aus der DLL laufen dabei in einem eigenen Thread parallel zum WinAC.
    Wie kann ich erreichen dass das Form bedienbar ist und die aufrufende Funktion in der DLL erst dann beendet wird wenn das Form geschlossen wurde?

    Grüße Oliver
    @sunny22 Willkommen im Forum. :thumbup:
    Rufe diese Form modal auf: frm.ShowDialog().
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Willkommen im Forum.

    Damit ich das nachvollziehen kann: WinAC läuft auf dem PC und ruft (D)eine DLL auf. In der willst Du ein Form erzeugen, welches der Daten anzeigt. Aber WinAC ruft die DLL auf und glaubt dann, dass das Ganze erledigt ist, aber Du willst, dass WinAC erst dann weitermacht, wenn …, tja, wenn was? Dein Form geschlossen wurde? Weil: Dann wäre WinAC wohl im Wartemodus und könnte ggf. nicht bedient werden, bis Du fertig bist.
    Falls dem allen so ist, vermute ich, dass der DLL-Aufruf von WinAC dafür gedacht ist, eine schnell abarbeitbare Funktion aufzurufen und dann weiterzumachen wie bisher. Ein langes Warten auf die DLL ist vielleicht gar nicht vorgesehen. Aber vielleicht verstehe ich auch den Ablauf (noch) nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Aber vielleicht verstehe ich auch den Ablauf (noch) nicht.
    Jou.

    sunny22 schrieb:

    Die Funktionen aus der DLL laufen dabei in einem eigenen Thread parallel zum WinAC.
    Wer ist Master, wer ist Slave?
    Was passiert bzw. was soll nicht passieren, wenn der Dialog angezeigt wird?
    Mit .ShowDialog() wird nur der GUI-Thread angehalten, auf andere Threads hat .ShowDialog() keinen Einfluss.
    Wenn da z.B. noch ein Progress-Dialog läuft, dann hat der ggf. sogar eienen eigenen GUI-Thread.
    Ist es gewollt, dass Du die Maschine ausbremsen kannst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Danke für den Tipp und das Tutorial. Das werde ich testen.
    Master ist hier WinAC. Es erzeugt einen Slave Thread in dem dann die Funktionen laufen. Der Datenaustausch läuft über shared Memory. Zumindest habe ich die Anleitung so verstanden.
    Das eigentliche Steuerprogramm im WinAC läuft Zyklus-orientiert. Bei jedem Durchlauf wird geprüft ob die Funktion aus der DLL noch läuft oder nicht. Das Ergebnis kann man dann im Steuerprogramm auswerten. mehr passiert aus Sicht von WinAC erstmal nicht.
    @VaporiZed
    WinAC läuft auf dem PC und ruft (D)eine DLL auf. In der willst Du ein Form erzeugen, welches der Daten anzeigt. Aber WinAC ruft die DLL auf und glaubt dann, dass das Ganze erledigt ist

    Ja, kann man so sagen. Aus Sicht von WinAC ist es das ja auch in dem Moment wo die aufgerufene Funktion ihren Returm-Wert zurück gibt.
    Du willst, dass WinAC erst dann weitermacht, wenn …, tja, wenn was? Dein Form geschlossen wurde? Weil: Dann wäre WinAC wohl im Wartemodus und könnte ggf. nicht bedient werden, bis Du fertig bist.

    Jein, da WinAC in einem anderen Thread läuft macht es ja sowieso weiter. (siehe oben)
    dass der DLL-Aufruf von WinAC dafür gedacht ist, eine schnell abarbeitbare Funktion aufzurufen und dann weiterzumachen wie bisher.

    Das gibt es auch. Das ist aber nicht die Art des Aufrufs die ich im aktuellen Projekt benutze.
    Ok, wenn also WinAC darauf wartet, dass die DLL-Funktion einen Wert zurückgibt, musst Du also diesern DLL-Thread stoppen, bis Du soweit fertig bist. Dann ist das mit dem von RfG vorgeschlagenem ShowDialog wohl der richtige Weg.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also mit .ShowDialog() funktioniert es so wie gedacht. das Problem was ich jetzt noch habe ist, dass das Form in der Session_0 angezeigt wird. Ich vermute mal das liegt daran dass WinAC als Dienst auch dort läuft. Mal sehen ob ich da eine Lösung finde oder den Rechner mit Win XP laufen lassen muss.
    Auf jeden Fall danke für Eure Hilfe.

    sunny22 schrieb:

    mit Win XP
    Da musst Du aufpassen, welches Framework da ühaupt läuft.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!