Подтвердить что ты не робот

Как получить файл HANDLE из foken FILE структуры?

Функция fopen возвращает указатель на структуру FILE, которая должна считаться непрозрачным значением, не имея дело с ее содержанием или значением.

В Windows среда выполнения C является оболочкой Windows API, а функция fopen основана на функции CreateFile. Функция CreateFile возвращает HANDLE, которая используется другим API Windows.

Теперь мне нужно использовать Windows API глубоко внутри библиотеки, которая использует fopen и FILE*. Итак: есть ли способ получить HANDLE из структуры FILE? Поскольку это специфичный компилятор, я имею в виду библиотеку времени выполнения MSVC.

Я понимаю, что это был бы уродливый, не переносимый хак, и это может сломаться, если Microsoft изменит внутренний формат FILE... но я развиваюсь в закрытой системе (то есть на встроенной Windows CE система), а рефакторинг библиотеки будет сложным и трудоемким.

4b9b3361

Ответ 1

Используйте _fileno, а затем _get_osfhandle. Не забывайте _close, когда вы закончите.

EDIT: мне не ясно, что _get_osfhandle поддерживается в WinCE. Однако документы для WinCE _fileno говорят, что он возвращает "дескриптор файла", а не "дескриптор". YMMV, но это говорит о том, что вы можете просто использовать возвращаемое значение _fileno непосредственно как дескриптор WinCE.

EDIT: # 2 Эта теория поддерживается этот человек.

"Если вы посмотрите на заголовочные файлы, которые я опубликовал в списке 29 января вы можете увидеть, как я справился с проблемой создания файла/обработки. У меня не было для замены всех элементов FILE * с помощью HANDLE. См. Следующий фрагмент из 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

Оказывается, _fileno возвращает дескриптор. Вам просто нужно бросить это. "

Ответ 2

В Linux есть функция int fileno(FILE *);, которая возвращает дескриптор файла (тот, который был возвращен низкоуровневой функцией open) из FILE*.

Я не знаю, относится ли это к Windows и возвращает HANDLE, хотя?

Ответ 3

Для C попробуйте это

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