web-dev-qa-db-ja.com

fopen FILE構造からファイルHANDLEを取得するにはどうすればよいですか?

_fopen_関数は、FILE構造体へのポインターを返します。これは、内容や意味を扱わずに、不透明な値と見なす必要があります。

Windowsでは、CランタイムはWindows APIのラッパーであり、fopen関数はCreateFile関数に依存しています。 CreateFile関数はHANDLEを返します。これは、他のWindowsAPIで使用されます。

ここで、fopenと_FILE*_を使用するライブラリの奥深くでWindowsAPIを使用する必要があります。つまり、HANDLE構造からFILEを取得する方法はありますか?これはコンパイラ固有であるため、MSVCランタイムライブラリを意味します。

これは醜い、移植性のないハックであり、MicrosoftがFILE...の内部形式を変更すると壊れることがあることを理解していますが、私はクローズドシステム(つまり、Windows CE Embedded)で開発していますシステム)およびライブラリのリファクタリングは困難で時間がかかります。

27
lornova

_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がハンドルを返すことがわかりました。キャストするだけです。」

16
Steve Townsend

Linuxには、_FILE*_からファイル記述子(低レベルのopen関数によって返されたもの)を返すint fileno(FILE *);関数があります。

それがWindowsに適用され、HANDLEを返すかどうかはわかりませんが?

5
Didier Trosset

Cの場合は、これを試してください

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));
3
Steven Penny