vs2015 visual update studio sdks runtimes prereq microsoft kb2999226 for c winapi windows-ce msvcrt crt

visual - ¿Cómo obtengo el archivo HANDLE de la estructura fopen FILE?



windows sdks (3)

La función fopen devuelve un puntero a una estructura FILE , que debe considerarse un valor opaco, sin tratar con su contenido o significado.

En Windows, el tiempo de ejecución de C es un contenedor de la API de Windows, y la función fopen basa en la función CreateFile . La función CreateFile devuelve un HANDLE , que es utilizado por otra API de Windows.

Ahora, necesito usar la API de Windows en el interior de una biblioteca que usa fopen y FILE* . Entonces, ¿hay alguna manera de obtener el HANDLE de la estructura FILE ? Como esto es específico del compilador, me refiero a la biblioteca de tiempo de ejecución de MSVC.

Entiendo que esto sería un hack feo y no portátil, y que podría fallar si Microsoft cambia el formato interno de FILE ... pero estoy desarrollando un sistema cerrado (es decir, en un sistema embebido de Windows CE) y refactorizando el la biblioteca sería difícil y consumiría mucho tiempo.


En Linux, está el int fileno(FILE *); función que devuelve el descriptor de archivo (el que fue devuelto por la función de open bajo nivel) del FILE* .

No sé si se aplica a Windows y devuelve el identificador aunque?


Para C, intente esto

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


Use _fileno seguido de _get_osfhandle . No te olvides de _close cuando hayas terminado.

EDITAR: no está claro para mí que _get_osfhandle sea ​​compatible con WinCE. Sin embargo, los documentos para _fileno dicen que devuelve un "identificador de archivo" en lugar de "descriptor". YMMV, pero esto sugiere que quizás solo _fileno usar _fileno return value directamente como manejador en WinCE.

EDITAR: # 2 Esa teoría está respaldada por la experiencia de esta persona .

"Si echas un vistazo a los archivos de cabecera que publiqué en la lista el 29 de enero, puedes ver cómo manejé el problema de creación / manejo del archivo. No tuve que reemplazar todos los elementos de ARCHIVO * con MANILLAR. Mira el siguiente fragmento de 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

Resulta que _fileno devuelve un identificador. Solo tienes que lanzarlo ".