열려 있는 파일 구조에서 파일 핸들을 가져오려면 어떻게 해야 합니까?
그fopen
함수는 포인터를 반환합니다.FILE
내용이나 의미를 다루지 않고 불투명한 값으로 간주해야 하는 구조입니다.
Windows에서 C 런타임은 Windows API의 래퍼입니다.fopen
기능은 다음에 의존합니다.CreateFile
기능. 그.CreateFile
함수는 a를 반환합니다.HANDLE
다른 윈도우즈 API에서 사용하는 파일입니다.
이제, 나는 윈도우 API를 사용하는 라이브러리의 깊숙한 곳에서fopen
그리고.FILE*
그래서: 그것을 얻을 수 있는 방법이 있습니까?HANDLE
에서FILE
구조?컴파일러마다 다르므로 MSVC 런타임 라이브러리를 의미합니다.
저는 이것이 못생긴 휴대용 해킹이 될 것이고, 만약 마이크로소프트가 내부 포맷을 변경한다면 그것은 깨질 수도 있다는 것을 이해합니다.FILE
하지만 저는 폐쇄형 시스템(즉, Windows CE 내장형 시스템)에서 개발 중이며 라이브러리를 리팩터링하는 것은 어렵고 시간이 많이 걸릴 것입니다.
사용하다_fileno
다음에_get_osfhandle
잊지 마세요_close
당신이 끝나면 그것.
편집: 그것이 무엇인지 확실하지 않습니다._get_osfhandle
는 WinCE에서 지원됩니다.그러나 WinCE의 문서는_fileno
"파일 핸들"이 아닌 "파일 핸들"을 반환한다고 말합니다.YMMV 하지만 이것은 당신이 그냥 사용할 수 있다는 것을 암시합니다._fileno
값을 WinCE에서 핸들로 직접 반환합니다.
편집: #2 그 이론은 이 사람의 경험에 의해 뒷받침됩니다.
"제가 1월 29일에 목록에 올린 헤더 파일을 보시면 제가 파일 생성/처리 문제를 어떻게 처리했는지 알 수 있습니다.모든 FILE* 항목을 HANDLE로 교체할 필요가 없었습니다.fileio.cpp의 다음 스니펫을 참조하십시오.
#ifndef q4_WCE
FlushFileBuffers((HANDLE) _get_osfhandle(_fileno(_file)));
HANDLE h = ::CreateFileMapping((HANDLE)
_get_osfhandle(_fileno(_file)),
0, PAGE_READONLY, 0, len, 0);
#else
FlushFileBuffers((HANDLE) _fileno(_file));
HANDLE h = ::CreateFileMapping((HANDLE) _fileno(_file),
0, PAGE_READONLY, 0, len, 0);
#endif //q4_WCE
_fileno가 핸들을 반환하는 것으로 나타났습니다.캐스팅만 하면 됩니다."
리눅스에는 다음과 같은 것들이 있습니다.int fileno(FILE *);
파일 설명자(낮은 수준에서 반환된 것)를 반환하는 함수open
기능)에서FILE*
.
윈도우에 적용이 되고 핸들을 돌려주는지는 모르겠지만요?
C를 위해서, 이것을 시도해 보세요.
HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));
언급URL : https://stackoverflow.com/questions/3989545/how-do-i-get-the-file-handle-from-the-fopen-file-structure
'programing' 카테고리의 다른 글
Ebean - 동적 쿼리 - 준비된 문의 불일치 매개 변수 개수 오류 (0) | 2023.08.30 |
---|---|
고유 키가 정의된 mariadb 테이블의 이상한 동작(즉, 고유하지 않음) (0) | 2023.08.30 |
안드로이드 브라우저에서 내 앱을 시작하는 링크를 만드시겠습니까? (0) | 2023.08.26 |
전체 Android 앱에 대한 기본 글꼴 제품군을 설정하는 방법 (0) | 2023.08.26 |
자바.java.javanoClassDefFoundError: javax/xml/soap/SOAP 예외 (0) | 2023.08.26 |