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

Как сделать FILE * из HANDLE в WinApi?

Есть ли простой способ создать FILE * из WinApi HANDLE, который указывает на один конец трубы? Что-то вроде unix: fdopen(fd,<mode>);

4b9b3361

Ответ 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, вам нужно его дважды открыть