Wie erhalte ich die Datei HANDLE aus der fopen FILE-Struktur?
Lesezeit: 3 Minuten
Lornova
Das fopen Die Funktion gibt einen Zeiger auf a zurück FILE Struktur, die als undurchsichtiger Wert betrachtet werden sollte, ohne sich mit ihrem Inhalt oder ihrer Bedeutung zu befassen.
Unter Windows ist die C-Laufzeit ein Wrapper der Windows-API, und die fopen Funktion stützt sich auf die CreateFile Funktion. Das CreateFile Funktion gibt a zurück HANDLEdie von anderen Windows-APIs verwendet wird.
Jetzt muss ich die Windows-API tief in einer Bibliothek verwenden, die verwendet fopen und FILE*. Also: Gibt es eine Möglichkeit, das zu bekommen HANDLE von dem FILE Struktur? Da dies Compiler-spezifisch ist, meine ich die MSVC-Laufzeitbibliothek.
Ich verstehe, dass dies ein hässlicher, nicht tragbarer Hack wäre und kaputt gehen könnte, wenn Microsoft das interne Format von ändert FILE… aber ich entwickle auf einem geschlossenen System (dh auf einem eingebetteten Windows CE-System) und das Refactoring der Bibliothek wäre schwierig und zeitaufwändig.
Gute Frage, ich habe mich vor über 2 Jahren selbst damit befasst.
– Matt Tischler
21. Oktober 2010 um 20:25 Uhr
Steve Townsend
Verwenden _fileno gefolgt von _get_osfhandle. Vergiss es nicht _close es, wenn Sie fertig sind.
EDIT: das ist mir nicht klar _get_osfhandle wird von WinCE unterstützt. Allerdings die Dokumentation für WinCE _fileno Angenommen, es gibt ein “Dateihandle” anstelle eines “Deskriptors” zurück. YMMV aber das deutet darauf hin, dass man es vielleicht einfach verwenden kann _fileno Rückgabewert direkt als Handle auf WinCE.
„Wenn Sie sich die Header-Dateien ansehen, die ich am 29. Januar in die Liste gepostet habe, können Sie sehen, wie ich mit dem Dateierstellungs-/Handhabungsproblem umgegangen bin. Ich musste nicht alle FILE*-Elemente durch HANDLEs ersetzen. Siehe das folgende Snippet aus fileio.cpp:
Es stellt sich heraus, dass _fileno ein Handle zurückgibt. Du musst es nur werfen.”
Vielen Dank, _fileno war gut genug für mein Windows CE-Problem, aber Ihre Antwort scheint auf allen MS-Plattformen mit jeder Version von MSVC tatsächlich “portabel” zu sein.
– Lornova
21. Oktober 2010 um 17:54 Uhr
Unter Linux gibt es die int fileno(FILE *); Funktion, die den Dateideskriptor zurückgibt (denjenigen, der von der Low-Level open Funktion) aus der FILE*.
Ich weiß nicht, ob es für Windows gilt und das HANDLE zurückgibt?
Hm, das ist möglich: msdn.microsoft.com/en-us/library/ee479262.aspx besagt, dass “_fileno Datei-Handle erhält, die dem Stream zugeordnet ist”. Zumindest unter Windows CE sollte es funktionieren.
– Lornova
21. Oktober 2010 um 16:28 Uhr
Es ist nur eine Kompatibilitätsfunktion für *nix. Handles haben Zeigergröße, 8 Bytes unter Win64.
Gute Frage, ich habe mich vor über 2 Jahren selbst damit befasst.
– Matt Tischler
21. Oktober 2010 um 20:25 Uhr