Сообщений 4    Оценка 60        Оценить  
Система Orphus

Как преобразовать FILE* в HANDLE и наоборот?

Автор: Игорь Вартанов

Версия текста: 1.0

FILE* -> HANDLE

#include <windows.h>
#include <stdio.h>
#include <io.h>

FILE*  f      = fopen(path, szMode);
int    handle = f->_file; // либо    handle = _fileno(f);
HANDLE hFile  = (HANDLE) _get_osfhandle(handle);

HANDLE -> FILE*

#include <windows.h>
#include <stdio.h>
#include <io.h>

HANDLE hFile  = CreateFile(...);
int    handle = _open_osfhandle((LONG)hFile, _mode);
FILE*  f      = fdopen(handle, szMode);

Во всех указанных случаях режимы открытия файлов должны быть согласованы между собой. Иначе говоря, если поток FILE* открыт на чтение, то невозможно будет получить из него HANDLE, доступный на запись.

ПРЕДУПРЕЖДЕНИЕ
Особенно важно помнить о том, что если вы занялись подобными преобразованиями, вы в подробностях должны осознавать все возможные последствия ваших действий. К примеру, вы начали работать с файлом посредством функции библиотеки времени исполнения (скажем, fopen( )), затем получили для тех или иных целей значение хэндла операционной системы для вашего файла... и закрыли его через CloseHandle( ). Не существует механизма, посредством которого библиотека времени исполнения могла бы узнать о ваших действиях в этом случае. Поэтому закрытие хэндла для нее окажется полной неожиданностью, и дальнейшее поведение ее функций непредсказуемо. В лучшем случае вы получите сообщение "Инструкция по адресу ... обратилась к памяти по адресу ... Память не может быть read". В худшем случае "совершенно необъяснимо" у вас прекратят выполняться файловые операции, и вы потратите кучу времени на выяснение причины. Будьте внимательны.

Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 4    Оценка 60        Оценить