内存映射/文件映射形式下的进程交通讯不分32位还是64位,是因为本质上使用的是系统物理页面(系统位数)。
主要是三个函数:CreateFileMapping;MapViewOfFile(映射内存),OpenFileMapping。
// FileSend.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include<Windows.h>
int main()
{
HANDLE MappingHandle = NULL;
PVOID BaseAddres = NULL;
MappingHandle=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0X1000,L"HelloWorld");
if (MappingHandle == NULL)
{
return 0;
}
BaseAddres = MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS,0, 0, 0);
__try
{
memcpy(BaseAddres, "HelloClient", strlen("HelloClient") + 1);
printf("%s\r\n", BaseAddres);
printf("Input AnyKey To Continue\r\n");
getchar();
printf("%s\r\n", BaseAddres);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("异常\r\n");
goto Exit;
}
Exit:
if (MappingHandle != NULL)
{
CloseHandle(MappingHandle);
MappingHandle = NULL;
}
printf("Input AnyKey To Exit\r\n");
getchar();
return 0;
}
// FileRecv.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include<windows.h>
int main()
{
HANDLE MappingHandle = NULL;
PVOID BaseAddres = NULL;
MappingHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, L"HelloWorld");
if (MappingHandle == NULL)
{
return 0;
}
BaseAddres = MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
__try
{
printf("%s\r\n", BaseAddres);
memcpy(BaseAddres, "HelloServer", strlen("HelloServer") + 1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("异常\r\n");
goto Exit;
}
Exit:
if (MappingHandle != NULL)
{
CloseHandle(MappingHandle);
MappingHandle = NULL;
}
printf("Input AnyKey To Exit\r\n");
getchar();
return 0;
}
Send:创建句柄-映射虚拟内存-将“HelloClient”写入虚拟内存-等待-读虚拟内存
Recv:打开句柄-映射虚拟内存-读虚拟内存-将“HelloServer”写入虚拟内存-等待
(运行的时候先启动Send再Recv)。
遇到的问题:
1.内存映射的方式较简单,主要就是三个函数的使用问题。