1

CreateFile関数のラッパー関数を生成したいとします。

この新しい関数は、ディスク上に実際のファイルを生成するのではなく、ファイル マッピング オブジェクトを作成し、新しいオブジェクトへのハンドルを返します。

この例、Creation Named Shared Memoryを見て、関数を実装しようとしました。

#define BUF_SIZE 256
TCHAR szName[] = TEXT("Global\\MyFileMappingObject");

HANDLE MyCreateFile()
{
     HANDLE hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // use paging file
        NULL,                    // default security
        PAGE_READWRITE,          // read/write access
        0,                       // maximum object size (high-order DWORD)
        BUF_SIZE,                // maximum object size (low-order DWORD)
        szName);                 // name of mapping object

     return hMapFile;
}

問題

これは私には問題ないように見えましたが、返さHANDLEれたReadFile関数を使用しようとすると、エラー コード 6 が発生しました。The handle is invalid.

質問

ファイル マッピング オブジェクトとファイル オブジェクトを同じ意味で使用できますか? もしそうなら、私のコードの問題は何ですか? そうでない場合、そのような機能をどのように実装できますか?

4

1 に答える 1

0

CreateFileMapping が返すハンドルはファイル マッピング オブジェクトであり、通常のファイルのハンドルではありません。CreateFileMapping は、メモリまたはバイト配列であるかのようにファイルにアクセスできる関数ファミリーの一部です。1 つの方法は、MyCreateFile() 関数内でMapViewOfFile (適切なパラメーターを使用)も呼び出し、MyCreateFile() 関数が MapViewOfFile によって返されるポインターを返すようにすることです。これで、このポインターを使用して MyReadFile() と MyWriteFile() を書き込むことができます。

クラスを作成して、その中にこれらすべての関数を含めることができれば、もっといいでしょう。

class CustomFile
{
    private:
            LPVOID *m_pData;
    public:                
            //m_pData is initialized here via CreateFileMapping and   
            //MapViewOfFile.
            CreateFile(...);   

            //m_pData is used here.
            ReadFile(...);
            WriteFile(...);
};
于 2015-03-19T12:24:56.467 に答える