win32共享内存简单实例

    xiaoxiao2021-12-14  17

    //win32ShareMemoryClient.cpp #include <Windows.h> #include <iostream> using namespace std; int main() { HANDLE hMutex = NULL; HANDLE hFileMapping = NULL; LPVOID lpShareMemory = NULL; HANDLE hServerWriteOver = NULL; HANDLE hClientReadOver = NULL; hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "SM_Mutex"); if (NULL == hMutex) { if (ERROR_FILE_NOT_FOUND == GetLastError()) { cout << "OpenMutex fail: file not found!" << endl; } else { cout << "OpenMutex fail:" << GetLastError() << endl; } goto CLIENT_SHARE_MEMORY_END; } //一旦互斥对象处于有信号状态,则该函数返回 if (WaitForSingleObject(hMutex, 5000) != WAIT_OBJECT_0) { cout << "WaitForSingle error:" << GetLastError() << endl; goto CLIENT_SHARE_MEMORY_END; } //open share memory hFileMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "ShareMemoryTest"); if (NULL == hFileMapping) { cout << "OpenFileMapping" << GetLastError() << endl; goto CLIENT_SHARE_MEMORY_END; } lpShareMemory = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (NULL == lpShareMemory) { cout << "MapViewOfFile " << GetLastError() << endl; goto CLIENT_SHARE_MEMORY_END; } //read and write data hServerWriteOver = CreateEvent(NULL, TRUE, FALSE, "ServerWriteOver"); hClientReadOver = CreateEvent(NULL, TRUE, FALSE, "ClientReadOver"); if (NULL == hServerWriteOver || NULL == hClientReadOver) { cout << "CreateEvent " << GetLastError() << endl; goto CLIENT_SHARE_MEMORY_END; } char p = 0; char* q = (char*)lpShareMemory; do { if (!SetEvent(hClientReadOver)) { goto CLIENT_SHARE_MEMORY_END; } if (WaitForSingleObject(hServerWriteOver, INFINITE) != WAIT_OBJECT_0) { goto CLIENT_SHARE_MEMORY_END; } p = q[0]; putchar(p); if (!ResetEvent(hServerWriteOver)) { goto CLIENT_SHARE_MEMORY_END; } } while (p != '\n'); CLIENT_SHARE_MEMORY_END: if (NULL != hServerWriteOver) CloseHandle(hServerWriteOver); if (NULL != hClientReadOver) CloseHandle(hClientReadOver); if (NULL != lpShareMemory) UnmapViewOfFile(lpShareMemory); if (NULL != hFileMapping) CloseHandle(hFileMapping); if (NULL != hMutex) ReleaseMutex(hMutex); return 0; }

    //win32ShareMemoryServer.cpp #include <Windows.h> #include <iostream> using namespace std; int main() { HANDLE hMutex = NULL; HANDLE hFileMapping = NULL; LPVOID lpShareMemory = NULL; HANDLE hServerWriteOver = NULL; HANDLE hClientReadOver = NULL; //create share memory hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE, //映射文件的句柄, 若设为0xFFFFFFFF(即:INVALID_HANDLE_VALUE)则创建一个进程间共享的对象 NULL, //安全属性 PAGE_READWRITE, //保护方式 0, //对象的大小 1024*1024, "ShareMemoryTest"); // 映射文件名,即共享内存的名称 if (NULL == hFileMapping) { cout << "CreateFileMapping fail:" << GetLastError() << endl; goto SERVER_SHARE_MEMORY_END; } lpShareMemory = MapViewOfFile( hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (NULL == lpShareMemory) { cout << "MapViewOfFile" << GetLastError() << endl; goto SERVER_SHARE_MEMORY_END; } //创建互斥对象,初始时不占有该互斥量,互斥对象名字是"SM_Mutex" hMutex = CreateMutex(NULL, FALSE, "SM_Mutex"); if (NULL == hMutex || ERROR_ALREADY_EXISTS == GetLastError()) { cout << "CreateMutex" << GetLastError() << endl; goto SERVER_SHARE_MEMORY_END; } //事件对象就像一个开关:它只有两种状态---开和关。当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”。 //send data hServerWriteOver = CreateEvent(NULL, //采用默认属性 TRUE, //创建的Event是自动复位还是人工复位.如果true,人工复位, 一旦该Event被设置为有信号,则它一直会等到ResetEvent()API被调用时才会恢复 为无信号. FALSE, //初始状态,true有信号,false无信号 "ServerWriteOver"); //事件对象的名称 hClientReadOver = CreateEvent(NULL, TRUE, FALSE, "ClientReadOver"); if (NULL == hServerWriteOver || NULL == hClientReadOver) { cout << "CreateEvent " << GetLastError() << endl; goto SERVER_SHARE_MEMORY_END; } char p = 0; char* q = (char*)lpShareMemory; do { p = getchar(); //在事件对象生成后,必须调用WaitForSingleObject来让线程进入等待状态 //当等待的时间超过该值后无信号同步对象仍处于”无信号”状态,线程不再等待, WaitForSingleObject函数会返回。 //如果想要线程一直等待,请把该参数设为INFINITE(该值等于0xffffffff)。 if (WaitForSingleObject(hClientReadOver, 5*1000) != WAIT_OBJECT_0) { goto SERVER_SHARE_MEMORY_END; } q[0] = p; if (!ResetEvent(hClientReadOver)) goto SERVER_SHARE_MEMORY_END;//把指定的事件对象设置为无信号状态 if (!SetEvent(hServerWriteOver)) goto SERVER_SHARE_MEMORY_END;//把指定的事件对象设置为有信号状态 } while (p != '\n'); SERVER_SHARE_MEMORY_END: //release share memory if (NULL != hServerWriteOver) CloseHandle(hServerWriteOver); if (NULL != hClientReadOver) CloseHandle(hClientReadOver); if (NULL != lpShareMemory) UnmapViewOfFile(lpShareMemory); if (NULL != hFileMapping) CloseHandle(hFileMapping); if (NULL != hMutex) ReleaseMutex(hMutex); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-963805.html

    最新回复(0)