파이프의 한쪽 끝을 가리키는 WinApi HANDLE에서 FILE *을 쉽게 만들 수 있습니까? 뭔가 우리는 유닉스에서처럼 : 당신은 파일 *을 가진 파일을 가지고 당신이 할 수있는 두 번WinApi에서 HANDLE로 FILE *을 만드는 방법은 무엇입니까?
17
A
답변
20
그것을 열 필요가 처리해야하는 경우 fdopen(fd,<mode>);
-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에 대해서는 테스트하지 않았으므로 위험성을 감수하십시오.
관련 문제
- 1. WinAPI에서 오디오 어댑터 열거하기
- 2. WinApi에서 GetClientRect와 GetWindowRect의 차이점은 무엇입니까?
- 3. 같은 머신에 새로운 "작업 카피", file : /// 또는 svn : //을 만드는 데 사용되는 저장소 접근 방법은 무엇입니까?
- 4. C#을 사용하여 링크를 만드는 방법은 무엇입니까?
- 5. SafeArray C#을 만드는 방법은 무엇입니까?
- 6. XSD : 다형성 "목록"을 만드는 방법은 무엇입니까?
- 7. Grails에서 컨트롤러의 "복제본"을 만드는 방법은 무엇입니까?
- 8. md5_file()을 더 빠르게 만드는 방법은 무엇입니까?
- 9. C++ 용 "makefile"을 만드는 방법은 무엇입니까?
- 10. 디렉토리가 win32 C/winapi에서 쓰기 가능한지 확인하는 방법은 무엇입니까?
- 11. NSURL에서 file : //을 잘라내는 방법
- 12. IE8은 type = "file"을 지원합니까?
- 13. file()을 점진적으로 사용 하시겠습니까?
- 14. WinAPI에서 불완전 멀티 바이트 문자를 감지하는 방법은 무엇입니까?
- 15. WinAPI에서 menustrip 만들기?
- 16. 잘못된 확장자를 가진 파일에서 TagLib #을 만드는 방법은 무엇입니까?
- 17. 메모리에 파일 (.aspx, html, txt)을 만드는 방법은 무엇입니까?
- 18. android에서보기를 만드는 방법은 무엇입니까?
- 19. FILE *
- 20. XAML에 ←을 만드는 방법
- 21. EclipseLink에서 JAXBContext를 만드는 방법은 무엇입니까?
- 22. CreateFile 결과의 FILE *을 어떻게 검색합니까?
- 23. <input type = file />을 J2EE/MySQL 백엔드에서 사용하기
- 24. TIFF 파일을 만드는 방법은 무엇입니까?
- 25. UIControl의 "핫 영역"을 더 크게 만드는 방법은 무엇입니까?
- 26. Silverlight에서 "연락처 목록"을 만드는 가장 좋은 방법은 무엇입니까?
- 27. "ensureIndexIsVisible"을 사용하여 스윙 스크롤을 만드는 방법은 무엇입니까?
- 28. 에스페르 (Esper) - 불만을 가진 "진술서 공장"을 만드는 방법은 무엇입니까?
- 29. C/C++을 사용하여 Linux 사용자를 만드는 방법은 무엇입니까?
- 30. 다중 프로세스 webkitgtk 응용 프로그램 (Vala)을 만드는 방법은 무엇입니까?
이러한 함수는 기본 핸들의 소유권을 갖습니까? 아니면 CloseHandle을 여전히 호출해야합니까? – user877329
@ user877329 : 여전히 CloseHandle()을 호출 할 필요가 있다고 생각합니다.하지만 확인해 볼 가치가 있습니다. 이러한 기능을 사용하고 나서 꽤 오랜 시간이 걸렸습니다. Microsoft 런타임 라이브러리 소스 코드는 컴파일러와 함께 제공되므로 테스트 프로그램을 작성하고 검사 할 수 있습니다. –