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

时间:2015-03-19 11:49:28

标签: c++ handle createfile file-mapping

说我想生成一个包含CreateFile函数的包装函数

这个新功能不会在磁盘上生成真实文件,但会create file mapping object并返回新对象的句柄。

我查看了这个示例Creating 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;
}

问题

对我来说这看起来不错,但是,当尝试使用ReadFile函数中返回的HANDLE时,我收到了错误代码6 The handle is invalid.

问题

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

1 个答案:

答案 0 :(得分:0)

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(...);
};