您的位置:首页 > 其它

共享内存应用于进程通信

2010-03-08 10:22 489 查看
在进程间通信时,使用共享内存的效率应该是最低的。现进行简单说明。
应用共享内存时,一共使用到如下4个函数
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName );
这个函数的第一个参数一般使用(HANDLE)0XFFFFFFFF,
倒数第二个参数使用要传递的数据大小,
最后一个参数是用CreateFileMapping函数生成的映射名(对于这个来说)

LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap );
这个函数是把内存地址跟要传递的文件进行映射
第一个参数就是CreateFileMapping函数的返回值
最后一个参数说明被映射到地址的数据大小,如果为0,则说明是全部被映射。
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress );
关闭映射的地址空间
在读文件的另一个进程中
HANDLE OpenFileMapping(
DWORD dwDesiredAccess, // access mode
BOOL bInheritHandle, // inherit flag
LPCTSTR lpName // object name
);
最后一个参数就是CreateFileMapping中最后一个参数的值
MapViewOfFile()就可以读出其值了。
最后的例子如下
写内存的例子
#include "stdafx.h"
#include "windows.h"
#include

using namespace std;

class student{
public:
long ID;
char name[20];
};

int main(int argc, char* argv[])
{
HANDLE hMemShare;
student stu;
int stu_num = 30;
student *lpstu;
stu.ID = 99041232;
strcpy(stu.name,"SecBug");
hMemShare = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,
0,sizeof(student),"TestMemShare");
if(hMemShare == NULL){
cout << "allocate is error"<

using namespace std;

class student{
public:
long ID;
char name[20];
};

int main(int argc, char* argv[])
{
HANDLE hMemShare;
student stu;
student *lpstu;

stu.ID = 0;
strcpy(stu.name ,"tst");
hMemShare = OpenFileMapping(FILE_MAP_READ,FALSE,"TestMemShare");

if(hMemShare == NULL){
cout << "openfilemapping error"<< endl;
return 0;
}

lpstu = (student*)MapViewOfFile(hMemShare,FILE_MAP_READ,0,0,sizeof(student));
if(lpstu == NULL){
cout << "MapViewOfFile error"<< endl;
return 0;
}
stu = *lpstu;
cout<
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: