![]() |
Re: dll als Bindeglied zwischen 2 Programmen
Zitat:
Und wenn du für das WM_Quit ein breakpoint bei deallocatehwnd setzt? |
Re: dll als Bindeglied zwischen 2 Programmen
Zitat:
Semaphore hab ich angelegt in meinem Programm A mit Startwert 0 und Maximalwert 1, in der Dll geöffnet und mit WaitForSingleObject gewartet. Wenn nun im Programm A nen Button gedrückt wird, mach ich ein ReleaseSemaphore und direkt ein WaitForSingleObject, das WaitFor.. in der Dll kehrt zurück, ich hole in der Dll die Daten aus Programm B (das hat die Dll geladen), mache ein ReleaseSemaphore und das Programm A weiß dass die Dll fertig ist... Den Ablauf kann man natürlich so noch länger hin und her wechseln lassen, um mehrere Daten über das MMF zu übertragen, allerdings hab ich da das Problem, dass manchmal ein Eintrag mehrmals im Programm A ankommt oder dass nicht alles ankommt.. Keine Ahnung, wieso... :/ Gibts zur Synchronisierung vllt ne schönere Möglichkeit? LG Edit: Zitat:
|
Re: dll als Bindeglied zwischen 2 Programmen
So aus der Beschreibung kann ich keinen Fehler erkennen... Allerdings kannst du statt einer Semaphore mit Maximalwert 1 auch ein Event nehmen.
|
Re: dll als Bindeglied zwischen 2 Programmen
Zitat:
Hat vielleicht jemand ne Idee, woran das liegen kann? Erzwingt das Programm vielleicht das freigeben von Ressourcen, bevor die Dll sich selbst aufgeräumt hat? Vielleicht sollte ich hier ansetzen um ne vernünftige Lösung zu finden..... :( |
Re: dll als Bindeglied zwischen 2 Programmen
Ich hätte da noch eine Idee, wie man das mit COM machen können:
Wenn eine Anwendung gestartet wird, schaut sie in der ROT (Running Objekt Table) nach einer bestimmten CoKlasse. Ist es vorhanden, wird der Interface-Zeiger abgeholt, falls nicht wird das Objekt neu erzeugt.
Delphi-Quellcode:
Dieses COM Objekt enthält nun eine Collection, in der beliebige Daten abgelegt werden können.
try
connector := GetActiveOleObject('InterAppConnector.Application'); except connector := CreateOleObject('InterAppConnector.Application'); end; connector.AddMember('Programm XY Vers. 1.8'); ... connector.Collection.AddItem('test', 47.11); Zwei oder mehr Anwendungen haben jetzt gleichzeitig Zugriff auf die Collection und können dort lesen und schreiben. Man könnte das noch weiter ausbauen, indem man verschiedene Collections zulässt. Ausserdem könnte jede Anwendung eine Callback-Schnittstelle anmelden um sich über Änderungen informieren zu lassen. Vorteile: * Unabhängig von der Programmiersprache können so Daten zwischen verschiedenen Anwendungen (auch VB/Java-Scripts) ausgetauscht werden. * einmal programmieren und immer wieder verwenden, da universell (unter Windows) einsetzbar * Entladen der ActiveX-DLL wird von Windows automatisch erledigt Nachteile: * NamedPipes oder TCP/IP sind schneller |
Re: dll als Bindeglied zwischen 2 Programmen
@@rab0r: Das Problem ist relativ einfach. Wenn die DLL entladen wird, wird der Speicher, in dem der Code stand, freigegeben. Wenn nun am Ende von WaitForSingleObject (welches in den immer noch geladenen Windows-DLLs steht) zurückgesprungen wird, ist die Rücksprungadresse somit ungültiger Speicher, also gibts ne AV.
|
Re: dll als Bindeglied zwischen 2 Programmen
Zitat:
Zum Thema COM: Meine Vermutung ist ja immernoch, dass die Syncronisation noch nicht 100% klappt, da bringt mit das Umsteigen von MMF auf COM auch erstmal nichts... :( Immernoch über Vorschläge dankbar, Groxxda |
Re: dll als Bindeglied zwischen 2 Programmen
Es gibt ein paar gute Möglichkeiten, den Thread abzubrechen. Am einfachsten ist wohl, wenn du mit WaitForSingleObjectEx wartest und dann vom Hauptthread aus QueueUserAPC aufrufst, zusätzlich am besten mit WaitFor auf den Thread warten. Im Thread prüfst du den Rückgabewert von WaitForSingleObjectEx, und falls er WAIT_IO_COMPLETION ist, weißt du, dass du abbrechen musst. So kannst du ein langes Warten vermeiden.
|
Re: dll als Bindeglied zwischen 2 Programmen
Statt über APC dürfte aber auch MSGWaitForMultipleObjects gehen, welches man mit einem Event oder mit einer Thread-Message auswecken kann. (Habe ich noch nie ausprobiert)
|
Re: dll als Bindeglied zwischen 2 Programmen
Zitat:
LG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 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