Forum: PC-Programmierung Windows CE 6.0 - DLL Programmierung (Vor-/Nachteile


von Josef (Gast)


Lesenswert?

Hallo zusammen,

ich habe mich nun etwas durchs Forum gelesen zu sämtlichen Sachen mit 
DLL , Interprozesskommunikation und Multihreading.
Wirklich schlauer bin ich noch nicht, eher verunsicherter dank solcher 
Wörter wie "DLL-Hell" :-D

Folgendes Szenario habe ich. Es gibt eine Anwendungsdatei die Daten 
verarbeitet und per TCP/IP an eine Oberfläche weiterleitet. Zusätzlich 
muss es Daten austauschen mit einem zweiten Programm welches über 
verschiedene HW Peripherien Daten erhält.

Das Oberflächen Programm können wir einfach mal ignorieren.
Im Moment ist es so gelöst das beide Programme eine Exe sind und über 
ein Virutalles Memmoryfile sprechen. Der Zugriff dadrauf wird per Global 
Mutex geregelt.

Da die Programme aber nicht wirklich alleine laufen müssen wäre nun der 
Gedanke die Programme zusammen zuführen. Es muss einzig und allein 
möglich sein, den einen Teil ohne den anderen Teil auszutauschen. 
Deswegen war auch früher der Gedanke der zweiten Exe entstanden.

Da ich nun die ersten Versuche mit einer DLL gemacht habe scheint es mir 
garnicht so unvernünftig eine DLL zu nehmen. Damit könnte ich sogar auf 
die Glboale Mutex und das Virtuelle File verzichten und einfach ein 
großes Array deklarieren und dieses in der DLL Freigeben bzw. Funktionen 
für den Zugriff schaffen.

In der Exe die eine DLL werden soll gibt es kein malloc oder der 
gleichen, alle Variablen/Arrays/Strukturen werden fest deklariert.
Es werden dort mehrere Threads mit hoher Priorität erstellt.

Nun kommen ein paar Verständnisfragen:

- Funktionen und Globale Variablen die ich nicht per DLLImport / Export 
Prefix deklariere können im anderen Programm nicht 
gesehen/benutzt/manipuliert werden, richtig?
- Speicherprobleme kan es nicht geben?! Probleme mit Heap oder Stack in 
irgendeiner weise?
- Threads können mit hoher Priorität erstellt werden oder hängen sie in 
irgendeinerweise an der Exe die sie erzeugt haben?
- Ich hatte was von Createthread Problem gelesen aber es nicht ganz 
verstanden. Was ist dort das Problem? Kann das bei mir auftretten?
Die Exe ruft eine Init Funktion der DLL auf, die DLL erzeugt die Tasks 
und diese laufen endlos im Hintergrund bis das Haupt-Exe-Programm 
geschlossen wird.


Die Funktionalität, dass die DLL von mehreren Programmen genutzt wird 
benötige ich garnicht. Ich möchte nur keine Statisch gelinkte Bibliothek 
haben, um dass Programm austauschen zu können!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Josef schrieb:
> Da ich nun die ersten Versuche mit einer DLL gemacht habe scheint es mir
> garnicht so unvernünftig eine DLL zu nehmen. Damit könnte ich sogar auf
> die Glboale Mutex und das Virtuelle File verzichten und einfach ein
> großes Array deklarieren und dieses in der DLL Freigeben bzw. Funktionen
> für den Zugriff schaffen.

Das funktioniert nicht; der in einer DLL verwaltete Speicher gehört dem 
aufrufenden Prozess, nicht der DLL. Und somit hat jeder Deiner zwei 
Prozesse seinen eigenen Speicherblock, der nichts mit dem anderen zu tun 
hat.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das funktioniert nicht; der in einer DLL verwaltete Speicher gehört dem
> aufrufenden Prozess, nicht der DLL. Und somit hat jeder Deiner zwei
> Prozesse seinen eigenen Speicherblock, der nichts mit dem anderen zu tun
> hat.

kann sein muss aber nicht. Man kann unter windows einer DLL über pragmas 
mitteilen das globale Variablen in der DLL zwischen verschienden 
anwendungen geshared werden. Dann ist die Variabel in der DLL in alle 
Anwendungen identisch.
Hatte ich mal für eine spezialaufgabe gebraucht und fand es recht 
pratisch.

http://msdn.microsoft.com/de-de/library/h90dkhs0%28v=vs.80%29.aspx

von Josef (Gast)


Lesenswert?

Oh da habe ich mich etwas falsch ausgedrückt.

Das eine Exe Programm würde als DLL bei dem anderen eingebunden.
Also Anstatt die Kommunikation "Exe - Virtual File - EXE" würde dann
"EXE - Global Array - DLL" stattfinden. Und das Global Array mit 
dllexport/import freigeben.

Aber verstehe ich dass nun richtig, dass wenn ein anderes Programm die 
DLL Wieder aufruft dort die globalen Variablen der DLL wieder neu 
erstellt werden und nicht mit Inhalt von dem anderen Aufruf gefüllt 
sind?!

Das nicht expliziet angegeben Globale Variablen/Funktionen der DLL in 
der Exe zur Verfügung stehen wollte ich auch eher vermeiden und nicht 
extra schaffen, aber besten Dank für den Hinweis dass so etwas möglich 
ist.

von Josef (Gast)


Lesenswert?

Zusatz: Wird die Echtzeitfähigkeit in irgendeiner Weise beeinträchtigt 
wenn man dass ganze als DLL startet?

von Klaus W. (mfgkw)


Lesenswert?

nach dem Starten nicht mehr.

von Josef (Gast)


Lesenswert?

Warum denn beim Starten?!

von Klaus W. (mfgkw)


Lesenswert?

Damit meinte ich nur, daß das Starten eines Prozesses wohl etwas 
schneller gehen kann, wenn alles in einer EXE steht; bei DLLs muß ja 
mehr gemacht gemacht werden. (Kann auch andersrum aussehen, wenn eine 
DLL bereits im Speicher ist beim Starten der EXE.)

Zur Laufzeit sollte man keinen Unterschied mehr spüren (eine evtl. 
Indirektion mehr ist bestenfalls meßbar, wenn man sehr genau hinschaut - 
wenn überhaupt).

"Echtzeitfähigkeit" hängt eher von anderen Dingen ab, z.B. ob 
angesprungener Code erst nachgeladen werden muß etc. und weniger davon, 
ob er in einer DLL steht oder in einer EXE.

von Josef (Gast)


Lesenswert?

Ah Ok! Ich hatte schon die Befürchtung das der loadlibary Befehl den 
kompletten Shedular aufs Ohr legt oder sonstige spielereien macht.

Klaus Wachtler schrieb:
> "Echtzeitfähigkeit" hängt eher von anderen Dingen ab, z.B. ob
> angesprungener Code erst nachgeladen werden muß etc. und weniger davon,
> ob er in einer DLL steht oder in einer EXE.

Gut, dass liegt aber nicht in meiner Hand bzw kann doch auch bei EXE und 
DLL auftretten.

Die DLL macht bei mir auch nicht mehr als eine EXE. das Automatische 
Starten bzw diese Treiberfunktionen sind nicht vorgesehen, es ist nur 
eine eigene Initfunktion vorgesehen, mit der ich meine Tasks in der DLL 
Starte und der Programmablauf durchläuft.


Im Moment habe ich aber auch dass Problem, dass eine andere Exe (Win CE 
Consolen Programm= nach einem Druck auf das X zwar geschlossen wird aber 
im Prozessviewer immer noch (nach Refresh) angezeigt wird. Also im 
Hintergrund definitiv weiter läuft. Wie kann ich sowas abfangen?! Was 
passiert da? Kann ich den Klick auf das X erkennen und eine 
Aufräumfunktion starten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.