1

假设我想为CreateFile函数生成一个包装函数

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

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

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

问题

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

问题

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

4

1 回答 1

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(...);
};
于 2015-03-19T12:24:56.467 回答