Bisakah objek pemetaan file dan objek file digunakan secara bergantian?

Katakanlah saya ingin membuat fungsi pembungkus ke BuatFile

Fungsi baru ini tidak akan menghasilkan file sebenarnya di disk tetapi buat objek pemetaan file dan kembalikan pegangan ke objek baru.

Saya telah melihat contoh ini, Membuat Memori Bersama Bernama, dan mencoba mengimplementasikan fungsi saya:

#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;
}

Masalah

Namun, bagi saya ini tampak oke ketika mencoba menggunakan HANDLE yang dikembalikan di ReadFile fungsi Saya mendapat kode kesalahan 6 The handle is invalid.

Pertanyaan

Bisakah objek pemetaan file dan objek file digunakan secara bergantian? Jika iya, lalu apa masalahnya dengan kode saya? Jika tidak, tahukah Anda bagaimana fungsi tersebut dapat diimplementasikan?


person idanshmu    schedule 19.03.2015    source sumber
comment
Mengapa Anda menggunakan ReadFile pada wilayah memori bernama? Ini seharusnya digunakan dengan MapViewOfFile.   -  person    schedule 19.03.2015
comment
ReadFile hanyalah contoh penggunaan HANDLE yang dikembalikan dari MyCreateFile. Ini di sini untuk menunjukkan bahwa implementasi MyCreateFile salah dan saya mencoba memahami alasannya.   -  person idanshmu    schedule 19.03.2015


Jawaban (1)


Pegangan yang dikembalikan CreateFileMapping adalah objek pemetaan file dan bukan file biasa. CreateFileMapping adalah bagian dari rangkaian fungsi yang memungkinkan akses ke file seolah-olah itu adalah memori atau array byte. Salah satu caranya adalah dengan menelepon MapViewOfFile(dengan parameter yang sesuai) di dalam fungsi MyCreateFile() Anda dan biarkan fungsi MyCreateFile() mengembalikan pointer yang dikembalikan oleh MapViewOfFile. Sekarang Anda dapat menulis MyReadFile() dan MyWriteFile() menggunakan pointer ini.

Akan lebih baik jika Anda bisa membuat kelas dan memasukkan semua fungsi ini di dalamnya.

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

            //m_pData is used here.
            ReadFile(...);
            WriteFile(...);
};
person sameerkn    schedule 19.03.2015