Wie erhalte ich die Datei HANDLE aus der fopen FILE-Struktur?

Lesezeit: 3 Minuten

Benutzeravatar von lornova
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

Benutzeravatar von Steve Townsend
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.

EDIT: #2 Diese Theorie wird unterstützt von die Erfahrung dieser Person.

„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:

#ifndef q4_WCE

  FlushFileBuffers((HANDLE) _get_osfhandle(_fileno(_file)));
  HANDLE h = ::CreateFileMapping((HANDLE)
_get_osfhandle(_fileno(_file)),
                        0, PAGE_READONLY, 0, len, 0);
#else

  FlushFileBuffers((HANDLE) _fileno(_file));
  HANDLE h = ::CreateFileMapping((HANDLE) _fileno(_file),
                    0, PAGE_READONLY, 0, len, 0);
#endif //q4_WCE

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.

    – Hans Passant

    21. Oktober 2010 um 16:53 Uhr

Benutzeravatar von Zombo
Zombo

Versuchen Sie dies für C

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));

  • Später verwendet, sagt mir dies, dass das Handle für zB stdout ungültig ist.

    – imallett

    17. Dezember 2016 um 19:39 Uhr

1386630cookie-checkWie erhalte ich die Datei HANDLE aus der fopen FILE-Struktur?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy