อ็อบเจ็กต์การแมปไฟล์และอ็อบเจ็กต์ไฟล์สามารถใช้สลับกันได้หรือไม่

สมมติว่าฉันต้องการสร้างฟังก์ชัน wrapper ให้กับ สร้างไฟล์

ฟังก์ชันใหม่นี้ จะไม่ สร้างไฟล์จริงบนดิสก์ แต่ สร้างวัตถุการแมปไฟล์ และส่งคืนหมายเลขอ้างอิงไปยังวัตถุใหม่

ฉันได้ดูตัวอย่างนี้แล้ว การสร้าง 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.

คำถาม

อ็อบเจ็กต์การแมปไฟล์และอ็อบเจ็กต์ไฟล์สามารถใช้สลับกันได้หรือไม่ หากเป็นเช่นนั้น รหัสของฉันจะมีปัญหาอะไร ถ้าไม่มีความคิดว่าจะสามารถใช้งานฟังก์ชั่นดังกล่าวได้อย่างไร?


person idanshmu    schedule 19.03.2015    source แหล่งที่มา
comment
เหตุใดคุณจึงใช้ ReadFile บนขอบเขตหน่วยความจำที่มีชื่อ มันควรจะใช้กับ MapViewOfFile   -  person    schedule 19.03.2015
comment
ReadFile เป็นเพียงตัวอย่างของการใช้ HANDLE ที่ส่งคืนของ MyCreateFile มีไว้เพื่อแสดงให้เห็นว่าการใช้งาน MyCreateFile มีข้อผิดพลาด และฉันกำลังพยายามทำความเข้าใจว่าทำไม   -  person idanshmu    schedule 19.03.2015


คำตอบ (1)


หมายเลขอ้างอิงที่ CreateFileMapping ส่งกลับเป็นวัตถุการแมปไฟล์ ไม่ใช่ของไฟล์ปกติ CreateFileMapping เป็นส่วนหนึ่งของตระกูลฟังก์ชันที่ช่วยให้สามารถเข้าถึงไฟล์ได้เหมือนกับว่าเป็นหน่วยความจำหรืออาร์เรย์ของไบต์ วิธีหนึ่งคือการเรียก MapViewOfFile(พร้อมพารามิเตอร์ที่เหมาะสม) ภายในฟังก์ชัน MyCreateFile() ของคุณ และปล่อยให้ฟังก์ชัน 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(...);
};
person sameerkn    schedule 19.03.2015