norains的专栏

只专注于WINCE开发

用户操作
[即时聊天] [发私信] [加为好友]
norainsID:norains
142908次访问,排名598,好友0人,关注者53人。
代码其实是一种乐趣
norains的文章
原创 189 篇
翻译 0 篇
转载 10 篇
评论 274 篇
norains的公告
联系方式请看置顶文章
最近评论
dfdf:讨厌MFC!我觉得MFC就是太乱了!看似无用的代码不要不行,MD微软啥都给我们做完了,原理性的东西我们却永远没法搞懂了!
ironox:有个地方 我觉得很别扭,不知道怎么办好

比如说 CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel\Volume"));
ControlPanel\Volume 有可能不存在呀,这个该怎么处理哦?对象虽然创建了,出错了也没提示
szterry:呵呵,果然工作狂技术狂,同感,一样的感觉……不过我才刚毕业一年……搞IT就是玩……
jinlking:这个botton的实现只是在主窗口画了一块区域,对于事件的处理还要放在主窗口的窗口处理函数之中,在对应的消息处理上调用CheckTap来判断是否是此“按钮”,问一下,这种方法与把按钮封装在子窗口中有什么区别,二者使用那个更好?
KUODY:博主真是好人
文章分类
收藏
    相册
    动漫
    文章图片
    程序交流
    xumercury的BLOG
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 进程间的数据共享收藏

    新一篇: PB 5.0 图标含义 | 旧一篇: 无奈的CSDN

    //========================================================================
    //TITLE:
    //    进程间的数据共享
    //AUTHOR:
    //    norains
    //DATE:
    //    Friday  20-June-2008
    //Environment:
    //    WINCE5.0 + VS2005 + MIPS SDK
    //========================================================================

        同一进程的不同线程间共享数据不是难事,并且方式也很多,不胜枚举;而不同的进程间需要共享数据,虽然方法不多,但却也颇有成效。
       
        其实不同进程间的数据共享很简单,只需要调用CreateFileMapping和MapViewOfFile即可。CreateFileMapping创建或获取一个内存文件句柄,而MapViewOfFile则是获取文件句柄的存储内存的起始地址。
       
        假设有两个程序,程序A负责设置数据,程序B负责读取,则简单的程序例子可以如下:
       
        程序A:

    #include "windows.h"
    #include "vector"

    #define MEM_SIZE 0x1000000
    #define MEM_SHARE_NAME TEXT("bobo")

    int WINAPI WinMain( HINSTANCE hInstance,
         HINSTANCE hPrevInstance,
         LPTSTR    lpCmdLine,
         int       nCmdShow)
    {
      //创建或获取内存文件句柄
     HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
     VOID * pMem = NULL;
     if(hFile != NULL)
     {
      //获取存储的内存地址
      pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);

      //设置数据
      std::vector<char> vtStr;
      vtStr.push_back(&apos;T&apos;);
      vtStr.push_back(&apos;E&apos;);
      vtStr.push_back(&apos;S&apos;);
      vtStr.push_back(&apos;T&apos;);
      vtStr.push_back(0);
      
      memcpy(pMem,&vtStr[0],vtStr.size());
     }

     //如果不再使用,应该关闭句柄
     //CloseHandle(hFile);
     
     return 0;
    }


        程序B:

    #include "windows.h"
    #include "vector"

    #define MEM_SIZE 0x1000000
    #define MEM_SHARE_NAME TEXT("bobo")

    int WINAPI WinMain( HINSTANCE hInstance,
         HINSTANCE hPrevInstance,
         LPTSTR    lpCmdLine,
         int       nCmdShow)
    {
     HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
     VOID * pMem = NULL;
     if(hFile != NULL)
     {
      pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);

      //读取数据
      std::vector<char> vtStr(6,0);
      memcpy(&vtStr[0],pMem,vtStr.size());
     }

     //如果不再使用,应该关闭句柄
     //CloseHandle(hFile);
     
     return 0;
    }


        这两个程序片段很简单,为了说明方便,并没有用到信号量同步。两个程序间之所以能够读取相同的内存地址,主要是调用CreateFileMapping函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。

    发表于 @ 2008年07月16日 23:19:00|评论(loading...)|编辑|收藏

    新一篇: PB 5.0 图标含义 | 旧一篇: 无奈的CSDN

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © norains