两个进程通过共享内存同步,控制播放器关闭
共享内存一致可像普通内存那样访问,读写,第一次同步失败,是因为析构函数走不到,进程已关闭。
1、返修工具端
HANDLE hShareMapFile = NULL; char* pShareBuf = NULL; /*共享内存通讯*/ int initShareMem(){ hShareMapFile = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUFFER_SIZE, MAP_FILENAME); //INVALID_HANDLE_VALUE表示创建一个进程间共享的对象 if (NULL == hShareMapFile) { _tprintf(TEXT("Could not create file mapping object (%d).\n"), GetLastError()); return -1; } //2. 将文件数据映射到进程的地址空间 pShareBuf = (char*)MapViewOfFile(hShareMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFFER_SIZE); if (NULL == pShareBuf) { _tprintf(TEXT("Could not map view of file (%d). \n"), GetLastError()); CloseHandle(hShareMapFile); hShareMapFile = NULL; return -1; } //3. 写入到内存中 char *str = "start"; memcpy(pShareBuf, str, strlen(str)+1); return 0; } void writeStr(char* str){ memcpy(pShareBuf, str, strlen(str) + 1); } void releaseShareMem(){ char *str = "myend"; memcpy(pShareBuf, str, strlen(str) + 1); if (pShareBuf!=NULL) UnmapViewOfFile(pShareBuf); if (hShareMapFile != NULL) CloseHandle(hShareMapFile); pShareBuf = NULL; hShareMapFile = NULL; }
2、播放器端,通过轮询 ifMainProsClose来判断dui是否已关闭。
HANDLE hShareMapFile = NULL; char* pShareBuf = NULL; public: int initShareMem() { hShareMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, MAP_FILENAME); if (NULL == hShareMapFile){ printf(("Could not open file mapping object (%d).\n"), GetLastError()); return -1; } //2. 将文件映射内核对象hFileMapping映射到当前应用程序的进程地址pBuf,通过该指针可以读写共享的内存区域 pShareBuf = (char*)MapViewOfFile(hShareMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFFER_SIZE); if (NULL == pShareBuf){ printf(("Could not map view of file (%d). \n"), GetLastError()); CloseHandle(hShareMapFile); hShareMapFile = NULL; return -1; } } bool ifMainProsClose() { if (strcmp(pShareBuf, "myend") == 0) return true; else return false; }