Dll übergreifender Zugriff auf Filehandles
-
Hallo,
ist es möglich mit createfile eine serielle schnittstelle zu öffnen und das entstehende Handle dann Prozess(dll)-übergreifend zu verwenden?
Wenn ich das Handle in einer Dll erstelle und an eine andere Dll übergebe und benutzen will kommt immer "Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" in c sharp bzw nichts (lasterror = 6) bei C++ Winapi. In der dll in welcher das handle erstellt wurde lässt sich einwandfrei damit arbeiten.
-
Ein Handle ist immer in einem Prozess gültig. DLLs liegen in einem Prozess, deshalb können solche Handles in beliebigen DLLs frei benutzt werden.
Ichvermute Dein Verständnis von DLL ist falsch. Eine DLL ist nur ein Stück Code. Sie hat weder Ähnlichkeit einem Prozess noch mit einem Thread, obwohl ein Thread in einem Prozess sicherlich Code aus einer DLL benutzen kann.Prozessübergreifend können auch Handle benutzt werden. Siehe DuplicateHandle
http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspxBTW: Handles können auch an Kindprozesses vererbt werden.
-
dann liefert mir die dll anscheinend nur ein dummy-handle
-
So ganz verstehe ich das Problem nicht!
Jede DLL-Instanz (für verschiedene Prozesse) legt eigene Handles an und sichert damit den Zugriff, hier auf eine serielle Schnittstelle. Darum braucht man sich um weiteres nicht mehr zu kümmern. Handles dienen allein Windows-intern, damit bei möglichen Verschiebungen der DLL im Speicher die Zugriffe über diese gesichert bleiben.
Erkläre bitte, was du genau vorhast und wo es da ein Problem gibt. Soll das Handle aus der DLL auch in der jeweiligen Anwendung verfügbar sein? Auch das lässt sich mit einer einfachen DLL-Funktion sauber regeln.
-
meine dll ruft zb die funktion OpenCom() einer anderen dll auf.
OpenCom öffnet die serielle schnittstelle und liefert ein Handle zurück das sich hCom nennt.
wenn ich jetzt in meiner dll mit dem gelieferten handle versuche zb getcommmodemstatus() aufzurufen kommt es zu den ewähnten fehlern.
daher denke ich dass die andere dll mir nicht das richtige handle auf die serielle schnittstelle liefert sondern nur einen dummy/ersatz/wrapper dafür.
-
Diesel schrieb:
daher denke ich dass die andere dll mir nicht das richtige handle auf die serielle schnittstelle liefert sondern nur einen dummy/ersatz/wrapper dafür.
Vermutlich. Solange Dir der Hersteller nicht sagt was es für ein Handle ist, wißt Du gar nichts. Du kannst also theoretisch nur etwas in dem Kontext der Anwednung/DLL/Lib anfangen.
Ein HANDLE ist eben nur ein Griff, und ob es Griff für die Klotür oder zum Rolls-Royce ist sagt die Dir Doku

PS: Deine Umschalt-Taste ist kaputt.
-
Gut, da sind wir im Verständnis deines Problems jetzt etwas weiter gekommen. Du hast also zwei DLLs, eine zum Einrichten der seriellen Schnittschnelle und eine weitere, die über den Handle aus der ersten DLL mit der seriellen Schnittstelle arbeiten soll. Daneben hast du noch eine oder mehrere Anwendungen, die von dem ganzen Gebrauch machen sollen. Habe ich das jetzt richtig verstanden?
edit: @Martin Richter: Wieso Hersteller-Doku befragen? Hat der Hersteller keine Windows-Schnittstelle (Treiber), um über WinApi ein verwendbares Handle darauf einsetzen zu können?
So wie ich weiss, gelten von Windows zugeteilte Handles global im System. Man muss sie nur überall verfügbar machen, wo man sie einsetzen will.