【问题标题】:CreateFileMapping() returns nullCreateFileMapping() 返回 null
【发布时间】:2013-10-21 15:40:42
【问题描述】:

我正在尝试遵循 MSDN 上的本教程:Creating Named Shared Memory

不幸的是,我从CreateFileMapping() 得到了NULLshmfile.txt 文件存在于我的文件系统中,所以我认为应该不会出现问题,映射将被创建,并且该文件将充当我的共享内存对象。

我做错了什么?

这是我的代码:

...
#define BUF_SIZE 256
TCHAR szName[]=TEXT("C:\\Users\\joe\\shmfolder\\shmfile.txt"); 
int main(){
    HANDLE hMapFile; // filehandle
LPCTSTR pBuf; 
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

if (hMapFile == NULL)
{
    _tprintf(TEXT("Could not create file mapping object (%d).\n"), GetLastError());
    return 1;
    }
    ...
}

【问题讨论】:

  • 您应该首先CreateFile() 获取文件的句柄,然后调用CreateFileMapping() 并将文件句柄作为第一个参数。并确保您调用的是正确版本的函数(CreateFileMappingA() 用于 ANSI 字符串,CreateFileMappingW() 用于宽字符串)。

标签: c++ winapi


【解决方案1】:

现在,您告诉CreateFileMapping 在页面文件中创建映射,然后使用现有文件的名称作为文件映射的名称。

您为文件映射对象指定的名称可以有 local\global\ 作为前缀,但不能包含任何其他反斜杠。

如果您想将预先存在的文件映射为共享内存区域,您可以按照以下一般顺序执行操作:

TCHAR szName[]=TEXT("C:\\Users\\joe\\shmfolder\\shmfile.txt"); 
TCHAR szMapName[]=TEXT("SharedFile"); 

HANDLE file = CreateFile(szName, ...);
HANDLE mapping = CreateFileMapping(file, ..., szMapName);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多