35

このfopen関数は構造体へのポインタを返しますがFILE、これは不透明な値と見なされるべきであり、その内容や意味は扱われません。

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

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

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

4

3 に答える 3

20

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

于 2010-10-21T16:44:48.463 に答える
7

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

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

于 2010-10-21T16:18:53.580 に答える
4

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

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));
于 2012-07-30T05:13:14.380 に答える