2011-03-04 4 views

답변

20

그것을 열 필요가 처리해야하는 경우 fdopen(fd,<mode>);

+1

이러한 함수는 기본 핸들의 소유권을 갖습니까? 아니면 CloseHandle을 여전히 호출해야합니까? – user877329

+0

@ user877329 : 여전히 CloseHandle()을 호출 할 필요가 있다고 생각합니다.하지만 확인해 볼 가치가 있습니다. 이러한 기능을 사용하고 나서 꽤 오랜 시간이 걸렸습니다. Microsoft 런타임 라이브러리 소스 코드는 컴파일러와 함께 제공되므로 테스트 프로그램을 작성하고 검사 할 수 있습니다. –

-2

당신이 ... 그들을 교환 (변환) 할 수 그러나 당신은 두 단계로 그것을해야만합니다. 먼저 _open_osfhandle()을 호출하여 Win32 HANDLE 값에서 C 런타임 파일 설명자를 얻은 다음 _fdopen()을 호출하여 파일 설명자에서 FILE* 개체를 가져옵니다.

1
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에 대해서는 테스트하지 않았으므로 위험성을 감수하십시오.

관련 문제