Могут ли объект отображения файла и объект файла использоваться взаимозаменяемо?

Скажем, я хочу сгенерировать функцию-оболочку для Создать файл"

Эта новая функция не будет создавать настоящий файл на диске, а создать объект сопоставления файлов и вернуть дескриптор нового объекта.

Я рассмотрел этот пример: Создание именованной общей памяти и попытался реализовать мою функцию:

#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