_fopen
_関数は、FILE
構造体へのポインターを返します。これは、内容や意味を扱わずに、不透明な値と見なす必要があります。
Windowsでは、CランタイムはWindows APIのラッパーであり、fopen
関数はCreateFile
関数に依存しています。 CreateFile
関数はHANDLE
を返します。これは、他のWindowsAPIで使用されます。
ここで、fopen
と_FILE*
_を使用するライブラリの奥深くでWindowsAPIを使用する必要があります。つまり、HANDLE
構造からFILE
を取得する方法はありますか?これはコンパイラ固有であるため、MSVCランタイムライブラリを意味します。
これは醜い、移植性のないハックであり、MicrosoftがFILE
...の内部形式を変更すると壊れることがあることを理解していますが、私はクローズドシステム(つまり、Windows CE Embedded)で開発していますシステム)およびライブラリのリファクタリングは困難で時間がかかります。
_fileno
の後に_get_osfhandle
を使用します。終わったら_close
することを忘れないでください。
編集:_get_osfhandle
がWinCEでサポートされているかどうかは私にはわかりません。ただし、WinCE _fileno
のドキュメントには、「記述子」ではなく「ファイルハンドル」が返されると記載されています。 YMMVですが、これは、WinCEのハンドルとして_fileno
戻り値を直接使用できることを示唆しています。
編集:#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がハンドルを返すことがわかりました。キャストするだけです。」
Linuxには、_FILE*
_からファイル記述子(低レベルのopen
関数によって返されたもの)を返すint fileno(FILE *);
関数があります。
それがWindowsに適用され、HANDLEを返すかどうかはわかりませんが?
Cの場合は、これを試してください
HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));