Как сделать FILE * из HANDLE в WinApi? - PullRequest
18 голосов
/ 04 марта 2011

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

Ответы [ 3 ]

23 голосов
/ 04 марта 2011

Вы можете сделать это, но вы должны сделать это в два этапа.Сначала вызовите _open_osfhandle(), чтобы получить дескриптор файла времени выполнения C из значения Win32 HANDLE, затем вызовите _fdopen(), чтобы получить объект FILE* из дескриптора файла.

2 голосов
/ 01 декабря 2016
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, поэтому используйте его на свой страх и риск.

0 голосов
/ 04 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...