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 ".