发送端
创建共享内存用的API
HANDLE CreateFileMapping(
HANDLE hFile, // handle to file to map
LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // optional security attributes, 是否被继承
DWORD flProtect, // protection for mapping object
DWORD dwMaximumSizeHigh, // high-order 32 bits of object size
DWORD dwMaximumSizeLow, // low-order 32 bits of object size
LPCTSTR lpName // name of file-mapping object
);
hFile // (HANDLE)0xFFFFFFFF 不指定共享内存句柄
lpFileMappingAttributes // 是否被继承
flProtect // 读写权限
dwMaximumSizeHigh //
dwMaximumSizeLow // 共享内存大小
lpName // 名字
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
int nRetCode = 0;
char szBuffer[] = "Shine";
HANDLE hMapping = CreateFileMapping(NULL,NULL,PAGE_READWRITE,0,4096,"ShareMemory");
LPVOID lpBase = MapViewOfFile(hMapping,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
// strcpy((char*)lpBase,szBuffer);
string s;
while(1)
{
cin>>s;
strcpy((char *)lpBase,s.c_str());
if(s == "exit")
{
Sleep(1000);
break;
}
}
UnmapViewOfFile(lpBase);
CloseHandle(hMapping);
return nRetCode;
}
接收端
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
int nRetCode = 0;
HANDLE hMapping;
do
{
hMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,"ShareMemory");
}while(!hMapping);
char *szBuffer;
if (hMapping)
{
wprintf(L"%s\r\n",L"wait Data");
// LPVOID lpBase = MapViewOfFile(hMapping,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
while(1)
{
szBuffer = (char *)MapViewOfFile(hMapping,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
// strcpy(szBuffer,(char*)lpBase);
if(szBuffer[0])
{
printf("%s\n",szBuffer);
if(strcmp(szBuffer,"exit") == 0)
{
break;
}
memset(szBuffer,0,sizeof(szBuffer));
}
}
}
memset(szBuffer,0,sizeof(szBuffer));
UnmapViewOfFile(szBuffer);
CloseHandle(hMapping);
return nRetCode;
}
多线程方案
发送端
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
HANDLE ShareThread;
HANDLE hEventInput;
char szBuffer[] = "Shine";
string inputStr;
class StaticLock
{
public:
StaticLock()
{
InitializeCriticalSection(&g_csTerm);
};
~StaticLock()
{
DeleteCriticalSection(&g_csTerm);
};
void lockon()
{
EnterCriticalSection(&g_csTerm);
};
void lockoff()
{
LeaveCriticalSection(&g_csTerm);
};
private:
CRITICAL_SECTION g_csTerm;
};
StaticLock lock;
DWORD WINAPI Share_thread(LPVOID)
{
HANDLE hMapping = CreateFileMapping(NULL,NULL,PAGE_READWRITE,0,4096,"ShareMemory");
LPVOID lpBase = MapViewOfFile(hMapping,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
// strcpy((char*)lpBase,szBuffer);
string s;
while(1)
{
WaitForSingleObject(hEventInput,INFINITE);
lock.lockon();
strcpy((char *)lpBase,inputStr.c_str());
if(s == "exit")
{
Sleep(1000);
break;
}
lock.lockoff();
ResetEvent(hEventInput);
}
UnmapViewOfFile(lpBase);
CloseHandle(hMapping);
}
int main(void)
{
int nRetCode = 0;
hEventInput = CreateEvent(NULL,true,false,NULL);
ShareThread = CreateThread(NULL,0,Share_thread,NULL,0,NULL);
//HANDLE CreateFileMapping(
// HANDLE hFile, //物理文件句柄
// LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
// DWORD flProtect, //保护设置
// DWORD dwMaximumSizeHigh, //高位文件大小
// DWORD dwMaximumSizeLow, //低位文件大小
// LPCTSTR lpName //共享内存名称
//);
string s;
while(1)
{
cin>>s;
lock.lockon();
inputStr = s;
lock.lockoff();
SetEvent(hEventInput);
}
CloseHandle(ShareThread);
CloseHandle(hEventInput);
return nRetCode;
}
接受端
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <iostream>
using namespace std;
HANDLE hThreadShared;
HANDLE hMapping;
DWORD WINAPI Shared_Thread(LPVOID)
{
do
{
hMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,"ShareMemory");
}while(!hMapping);
char *szBuffer;
if (hMapping)
{
wprintf(L"%s\r\n",L"wait Data");
// LPVOID lpBase = MapViewOfFile(hMapping,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
while(1)
{
szBuffer = (char *)MapViewOfFile(hMapping,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
// strcpy(szBuffer,(char*)lpBase);
if(szBuffer[0])
{
printf("%s\n",szBuffer);
if(strcmp(szBuffer,"exit") == 0)
{
break;
}
memset(szBuffer,0,sizeof(szBuffer));
}
}
}
memset(szBuffer,0,sizeof(szBuffer));
UnmapViewOfFile(szBuffer);
CloseHandle(hMapping);
}
int main()
{
int nRetCode = 0;
hThreadShared = CreateThread(NULL,0,Shared_Thread,NULL,0,NULL);
WaitForSingleObject(hThreadShared, INFINITE);
CloseHandle(hThreadShared);
return nRetCode;
}