muaji
Muaji
2015-03-17 02:32
采纳率: 100%
浏览 4.5k

c++ windows下创建共享内存

用CreateFileMapping创建
在网上看到说共享内存块的名字要加"Global\",否则会使共享的内存只能在当前用户下被另一个或多个进程访问。
可是我在创建共享内存如下
图片说明
创建失败,返回的句柄为NULL

然后我改成这样
图片说明
初次调试成功了,然后我给使用者用,在他们机器上调试,又返回NULL了。

有没有可能是电脑系统的问题还是什么原因?名字究竟是该取"Global\share"还是"Global\\share"

会是什么情况创建失败?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 91program
    91program 2015-03-17 03:05
    已采纳

    失败时,用 GetLastError() 获取一下出错的代码,可以得到出错的原因。
    一则简单的Windows共享内存IPC代码
    Windows共享内存可以让两个进程对同一块内存进行读写。

    以下有2个进程,a.cpp生成A进程,b.cpp生成b进程。那么a进程将不停地读名为"Global\MyFileMappingObject"的共享内存块,而b进程不停地写名为"Global\MyFileMappingObject"的共享内存块。从而实现IPC。

    //a.cpp
    #include <windows.h>
    #include <string.h>
    #include <string>
    #include <iostream>
    #include <tchar.h>
    using namespace std;
    
    #define BUF_SIZE 256
    TCHAR szName[]=TEXT("Global\\MyFileMappingObject");    //指向同一块共享内存的名字
    
    int main(int argc, char *argv[])
    {
        HANDLE hMapFile;
        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;
        }
        pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
            FILE_MAP_ALL_ACCESS, // read/write permission
            0,
            0,
            BUF_SIZE);
    
        if (pBuf == NULL)
        {
            _tprintf(TEXT("Could not map view of file (%d).\n"),
                GetLastError());
    
            CloseHandle(hMapFile);
    
            return 1;
        }
        //从main开始至此,A B process代码一样,都是获取名为"Global\\MyFileMappingObject"的共享内存的指针
    
        //以下代码,A不停地读共享内存pBuf
        while(1)
        {
            cout<<pBuf<<endl;
            cout<<"A process: hit keyboard to receive from B process"<<endl;
            getchar();
        }
    
        UnmapViewOfFile(pBuf);
        CloseHandle(hMapFile);
        return 0;
    }
    
    
    
    
    
    
    
    
    //b.cpp
    #include <iostream>
    #include <Windows.h>
    #include <tchar.h>
    using namespace std;
    
    #define BUF_SIZE 256
    TCHAR szName[]=TEXT("Global\\MyFileMappingObject");    //指向同一块共享内存的名字
    
    int main()
    {
        HANDLE hMapFile;
        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;
        }
        pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
            FILE_MAP_ALL_ACCESS, // read/write permission
            0,
            0,
            BUF_SIZE);
    
        if (pBuf == NULL)
        {
            _tprintf(TEXT("Could not map view of file (%d).\n"),
                GetLastError());
    
            CloseHandle(hMapFile);
    
            return 1;
        }
        //从main开始至此,A B process代码一样,都是获取名为"Global\\MyFileMappingObject"的共享内存的指针
    
        //以下代码,B不停写共享内存pBuf
        while(1)
        {
            TCHAR s[BUF_SIZE];
            cout<<"B process: plz input sth. to be transfered to A process."<<endl;
            cin>>s;
            memcpy((PVOID)pBuf, s, BUF_SIZE);
        }
    }
    
    
    点赞 评论
  • caozhy

    一对反斜杠就可以了。另外相同的文件映射名只能有一个,再创建就出错了。和文件已经存在不能再创建的道理是一样的。

    点赞 评论
  • oyljerry
    oyljerry 2015-03-17 04:22

    两个斜杠,然后就是出错的时候,你看一下返回的错误提示信息来分析

    点赞 评论
  • jiangsheng
    蒋晟 2015-03-21 16:52

    在面向Vista+的程序里创建全局的内核对象需要提权并且启用SeCreateGlobalPrivilege。

    点赞 评论

相关推荐