开发者社区> 问答> 正文

c++ windows下创建共享内存

用CreateFileMapping创建
在网上看到说共享内存块的名字要加"Global",否则会使共享的内存只能在当前用户下被另一个或多个进程访问。
可是我在创建共享内存如下
图片说明
创建失败,返回的句柄为NULL
然后我改成这样
图片说明
初次调试成功了,然后我给使用者用,在他们机器上调试,又返回NULL了。
有没有可能是电脑系统的问题还是什么原因?名字究竟是该取"Globalshare"还是"Global\share"

会是什么情况创建失败?

展开
收起
a123456678 2016-03-05 16:07:00 2920 0
1 条回答
写回答
取消 提交回答
  • 失败时,用 GetLastError() 获取一下出错的代码,可以得到出错的原因。
    一则简单的Windows共享内存IPC代码
    Windows共享内存可以让两个进程对同一块内存进行读写。

    以下有2个进程,a.cpp生成A进程,b.cpp生成b进程。那么a进程将不停地读名为"GlobalMyFileMappingObject"的共享内存块,而b进程不停地写名为"GlobalMyFileMappingObject"的共享内存块。从而实现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);
        }
    }
    2019-07-17 18:53:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++开发PHP7扩展 立即下载
TAKING WINDOWS 10 KERNEL 立即下载
ECS运维指南之Windows系统诊断 立即下载