Есть ли простой способ создать FILE * из WinApi HANDLE, который указывает на один конец трубы?
Что-то вроде unix: fdopen(fd,<mode>);
Как сделать FILE * из HANDLE в WinApi?
Ответ 1
Вы можете сделать это, но вам нужно сделать это за два шага. Сначала вызовите _open_osfhandle()
, чтобы получить дескриптор файла времени выполнения C из значения HANDLE Win32, затем вызовите _fdopen()
, чтобы получить объект FILE*
из дескриптора файла.
Ответ 2
FILE* getReadBinaryFile(LPCWSTR path) {
HANDLE hFile = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
return nullptr;
}
int nHandle = _open_osfhandle((long)hFile, _O_RDONLY);
if (nHandle == -1) {
::CloseHandle(hFile); //case 1
return nullptr;
}
FILE* fp = _fdopen(nHandle, "rb");
if (!fp) {
::CloseHandle(hFile); //case 2
}
return fp;
}
мой код для получения дескриптора двоичного файла открытого чтения.
вы должны использовать fclose для закрытия FILE *, если вам это не нужно.
Я не тестировал случай 1 и 2, поэтому используйте его на свой страх и риск.
Ответ 3
вы не можете их обменивать (конвертировать). Если вам нужно иметь файл с файлом * и HANDLE, вам нужно его дважды открыть