#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
HANDLE hMapFile;
char abc[]="hello";//共享的字符串
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // Current file handle.
NULL, // Default security.
PAGE_READWRITE, // Read/write permission.
0, // Max. object size.
sizeof(abc), // Size of hFile.
L"MyFileMappingObject"); // Name of mapping object.
if (hMapFile == NULL)
{
cout<<"Could not create file-mapping object.";
}
LPVOID lpMapAddress;
lpMapAddress = MapViewOfFile(hMapFile, // Handle to mapping object.
FILE_MAP_ALL_ACCESS, // Read/write permission
0, // Max. object size.
0, // Size of hFile.
0); // Map entire file.
if (lpMapAddress == NULL)
{
cout<<"Could not map view of file.";
}
memcpy(lpMapAddress,abc,sizeof(abc));//将字符串写到共享内存中
getchar();//为了让另一个程序获取共享的内存
if (!UnmapViewOfFile(lpMapAddress)) //清理共享内存
{
cout<<"Could not unmap view of file.";
}
CloseHandle(hMapFile);
system("pause");
return 0;
}
上面是一个创建共享内存的程序,下面是一个读取共享内存的程序:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
HANDLE hMapFile;
LPVOID lpMapAddress;
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, // Read/write permission.
FALSE, // Do not inherit the name
L"MyFileMappingObject"); // of the mapping object.
if (hMapFile == NULL)
{
cout<<"Could not open file-mapping object.";
}
lpMapAddress = MapViewOfFile(hMapFile, // Handle to mapping object.
FILE_MAP_ALL_ACCESS, // Read/write permission.
0, // Max. object size.
0, // Size of hFile.
0); // Map entire file.
if (lpMapAddress == NULL)
{
cout<<"Could not map view of file.";
}
char abc[6];
char *a=abc;
a=reinterpret_cast<char *>(lpMapAddress);//读取共享内存
cout<<a;//输出在共享内存中的数据
system("pause");
return 0;
}
一般来说,创建共享内存有三个步骤:
1、创建文件内核对象(CreateFile,但是我们上面第一程序只是为了创建一个用来存放数据的空间,所以可以直接跳过这一步)
2、创建文件映射内核对象(CreateFileMapping,由于第一步省略,所以第一个参数要指定为:INVALID_HANDLE_VALUE)
3、将文件映射对象映射到进程的地址空间(MapViewOfFile)
至此,第三步返回的指针就是指向我们共享内存起始位置,使用方法如同其他指针一样。
而对应的,释放共享内存也有三个步骤:
清理也有三个步骤:
1、 取消进程空间与文件间的映射(UnmapViewOfFile)
2、 关闭文件映射内核对象(CloseHandle)
3、 关闭文件内核对象(上面程序省略这一步)