Windows 共享記憶體機制

應用情境:

    • 服務端讀取請求端所負責異動之記憶體,輸出訊息。
    • 服務端負責異動所屬記憶體,交由請求端讀取。
    • 請求端讀取服務端所負責異動之記憶體,輸出訊息。

服務端程式碼:

請求端程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

#include <windows.h>#include <stdio.h>#include <string>#include "SharedMemLib.h"void main(void) { #define BUFFER_SIZE (32 * sizeof(char))#define MESSAGE_SIZE (BUFFER_SIZE - sizeof(DWORD)) SharedMemLib *worker = new SharedMemLib(); char *nameOfMem = "Emprogria"; if (worker->Create(nameOfMem, BUFFER_SIZE)) { if (worker->Alloc()) { char *message = (char *)malloc(MESSAGE_SIZE); ZeroMemory(message, BUFFER_SIZE); DWORD count = 0; CopyMemory(worker->Read(), &count, sizeof(DWORD)); while (TRUE) { char *p = (char *)worker->Read(); char *msg = p + sizeof(DWORD); if (memcmp(message, msg, MESSAGE_SIZE)) { count++; CopyMemory(p, &count, sizeof(DWORD)); CopyMemory(message, msg, MESSAGE_SIZE); printf("%02d> %s\n", count, message); } Sleep(1000); } free(message); worker->Free(); } worker->Close(); } else { printf("Create Error:%d\n", GetLastError()); } }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

#include <windows.h>#include <stdio.h>#include "../SharedMemServer/SharedMemLib.h"void main(void) { #define BUFFER_SIZE (32 * sizeof(char))#define MESSAGE_SIZE (BUFFER_SIZE - sizeof(DWORD)) SharedMemLib *worker = new SharedMemLib(); const char* nameOfMem = "Emprogria"; if (worker->Open(nameOfMem)) { if (worker->Alloc()) { for (int i = 1; i <= 16; i++) { void *p = worker->Read(); DWORD remoteCount; memcpy(&remoteCount, p, sizeof(DWORD)); char *message = (char *) malloc(MESSAGE_SIZE); ZeroMemory(message, MESSAGE_SIZE); snprintf(message, MESSAGE_SIZE, "Hello-%02d",(remoteCount)); worker->Write(message, MESSAGE_SIZE, sizeof(DWORD)); printf("%s\n", message); free(message); Sleep(1000); } worker->Free(); } worker->Close(); } else { printf("Open Error:%d\n", GetLastError()); } }

程式庫程式碼 (.h):

程式庫程式碼 (.cpp):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

#pragma once#include <windows.h>#include <stdio.h>#include <string>class SharedMemLib { private: HANDLE hMapFile = NULL; DWORD sizeOfMem; void *Mem = NULL; public: SharedMemLib(); ~SharedMemLib(); BOOL Create(const char* nameOfMem, DWORD sizeOfMem); BOOL Open(const char* nameOfMem); BOOL Alloc(); void Free(); void Close(); void* Read(); void Write(void* message,

size_t messageLength, int startPosition); };

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

#include "SharedMemLib.h" SharedMemLib::SharedMemLib() { } SharedMemLib::~SharedMemLib() { } BOOL SharedMemLib::Create(const char* nameOfMem, DWORD sizeOfMem) { this->sizeOfMem = sizeOfMem; this->hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, this->sizeOfMem, nameOfMem); return (hMapFile != NULL); } BOOL SharedMemLib::Open(const char* nameOfMem) { this->hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, nameOfMem); return (hMapFile != NULL); } BOOL SharedMemLib::Alloc() { if (this->hMapFile == NULL) { return FALSE; } this->Mem = MapViewOfFile(this->hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, this->sizeOfMem); return (this->Mem != NULL); } void SharedMemLib::Free() { if (this->Mem != NULL) { UnmapViewOfFile(this->Mem); this->Mem = NULL; } } void SharedMemLib::Close() { if (this->hMapFile != NULL) { CloseHandle(this->hMapFile); this->hMapFile = NULL; } } void* SharedMemLib::Read() { return (this->Mem); } void SharedMemLib::Write(void* message, size_t messageLength, int startPosition) { char *p = (char *)this->Mem + startPosition * sizeof(char); CopyMemory(p,(void *)message, messageLength); }