4.24 共享内存
上午打了半天羽毛球,还虐了一个人两场,不错不错,1个月没打,还是不菜。
下午无聊效率很低,就看了下进程间通信的东西,果真效率低,看的东西就少,看了半天就看了一个共享内存。
然后写了一下共享内存的各个接口,方便以后自己用。
共享内存看的比较简单,就看了4个方面的东西。
1. 如何创建共享内存 ------ CreateFileMaping() ,详细介绍请百度。不过这里要提到一点,如果父进程创建一个共享内存可以通过继承关系传递给子进程,这是共享内存的计数要加1.
HANDLE CreateShareMemory(TCHAR* MemoryName){ HANDLE hMapFile=CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, memory_size, MemoryName ); return hMapFile; }
2.如何把共享内存映射到进程空间 ----- MapViewofFile() ,如字面意思就是把已知的一个共享内存映射到自己的进程空间。此时返回的是该共享内存的地址。
PVOID MapShareMemory(HANDLE hMapFile){ if(hMapFile==NULL) return NULL; PVOID pView=MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS, 0, VIEW_OFFSET, VIEW_SIZE ); return pView; }
3.如何写数据进共享内存 ----- memcpy_s() , 这是按照网上一个方法写的,看了以后应该有很多方法,以后弄明白再说。
void WriteMessage(PVOID pView,const TCHAR* message){ memcpy_s(pView, VIEW_SIZE, message, clen(message)*sizeof(TCHAR) ); }
4.如何从共享内存读数据 ----- 这个我没写好,因为我还不是很懂共享内存的东西,比如共享内存的大小,数据大小等一些问题。这个接口写的就很丑了。
PWSTR ReadMessage(PVOID pView){ if(NULL==pView) return NULL; PWSTR message=(PWSTR)pView; return message; }
下面给出头文件和cpp文件
// .h #include<Windows.h> #include <stdio.h> #include<tchar.h> #define memory_size 65536 #define VIEW_OFFSET 0 #define VIEW_SIZE 1024 #ifdef UNICODE #define tstr PWSTR #define clen wcslen #else #define tstr PSTR #define clen strlen #endif HANDLE CreateShareMemory(TCHAR* MemoryName); HANDLE OpenShareMemory(TCHAR* MemoryName); PVOID MapShareMemory(HANDLE hMapFile); void WriteMessage(PVOID pView ,const TCHAR* message); TCHAR* ReadMessage(PVOID pView);
//cpp #include "共享内存.h" HANDLE CreateShareMemory(TCHAR* MemoryName){ HANDLE hMapFile=CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, memory_size, MemoryName ); return hMapFile; } HANDLE OpenShareMemory(TCHAR* MemoryName){ HANDLE hMapFile=OpenFileMapping( FILE_MAP_ALL_ACCESS, NULL, MemoryName ); return hMapFile; } PVOID MapShareMemory(HANDLE hMapFile){ if(hMapFile==NULL) return NULL; PVOID pView=MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS, 0, VIEW_OFFSET, VIEW_SIZE ); return pView; } void WriteMessage(PVOID pView,const TCHAR* message){ memcpy_s(pView, VIEW_SIZE, message, clen(message)*sizeof(TCHAR) ); } PWSTR ReadMessage(PVOID pView){ if(NULL==pView) return NULL; PWSTR message=(PWSTR)pView; return message; }
两个调用的例子
创建并写数据
#include "共享内存.h" #define MAP_PREFIX L"Local\\" #define MAP_NAME L"SampleMap" #define FULL_MAP_NAME MAP_PREFIX MAP_NAME int main(){ HANDLE pMapFile=CreateShareMemory(FULL_MAP_NAME); PVOID pView=MapShareMemory(pMapFile); TCHAR* t_message=_T("hello,how are you"); WriteMessage(pView,t_message); getchar(); }
打开共享内存并读数据
#include"共享内存.h" #define MAP_PREFIX L"Local\\" #define MAP_NAME L"SampleMap" #define FULL_MAP_NAME MAP_PREFIX MAP_NAME int main(){ HANDLE pMapFile=OpenShareMemory(FULL_MAP_NAME); PVOID pView=MapShareMemory(pMapFile); PWSTR readmessage=ReadMessage(pView); wprintf(_T("%s"),(PWSTR)readmessage); }
浙公网安备 33010602011771号