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);
}

 

 

posted on 2014-04-24 19:54  云在心  阅读(309)  评论(0)    收藏  举报

导航