一则简单的Windows共享内存IPC代码

来源:互联网 发布:meego软件 编辑:程序博客网 时间:2024/06/06 21:45

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 256TCHAR 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 256TCHAR 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);    }}
复制代码
引用自:http://www.cnblogs.com/lihaozy/archive/2012/08/14/2638009.html
---------------
其他参考:
http://blog.csdn.net/wshjldaxiong/article/details/8076991
http://www.oschina.net/code/snippet_102078_24050
http://zxdflyer.blog.163.com/blog/static/2566426220114693131674/
http://baike.baidu.com/link?url=aMEvjT4r8FjX65Ewzb1GYsf46186dVcvtWiFm3uoLRCtNOY-EDMZjaHUp2l4P57HmR7433GacRHXiILlyfk0pq
http://blog.csdn.net/j6915819/article/details/8437274
http://www.cnblogs.com/shipfi/archive/2006/05/27/410658.html

0 0