文件映射对象和文件对象可以互换使用吗

Can file mapping object and file object be used interchangeably?

本文关键字:文件 对象 互换 映射      更新时间:2023-10-16

假设我想生成一个包装器函数来创建文件函数

这个新函数不会在磁盘上生成真正的文件,而是创建文件映射对象并返回新对象的句柄。

我看了这个例子,创建命名共享内存,并尝试实现我的功能:

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

问题

然而,当我尝试在ReadFile函数中使用返回的HANDLE时,我得到了错误代码6 The handle is invalid.

问题

文件映射对象和文件对象可以互换使用吗?如果是,那么我的代码有什么问题?如果没有,你知道如何实现这样的功能吗?

CreateFileMapping返回的句柄是一个文件映射对象,而不是常规文件的句柄。CreateFileMapping是一系列函数的一部分,这些函数允许访问文件,就好像它们是内存或字节数组一样。一种方法是在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(...);
};