文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Windows平台进程间通信: 内存映射

Windows平台进程间通信: 内存映射

时间:2010-11-08  来源:kgisme170

        CreateFileMapping是个通用函数,可以把文件映射到内存,也可以不通过任何文件,直接建立一个内存共享区域----只需要把第一个参数Handle指定为INVALID_HANDLE_VALUE就可以了。这映射的内存在被CloseHandle关闭之前,都是可以被任何其他进程用该映射的名称加以引用的。下面的例子程序中,主程序申请一个内存映射,写入一个数字(33);CreateProcess创建的子进程读出来并修改;主进程等待子进程结束,并再次读出修改后的数值(44)。
        主程序代码:

#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <WinBase.h>
int _tmain(int argc, _TCHAR* argv[]){
    SECURITY_ATTRIBUTES sa;
    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle=TRUE;
    sa.lpSecurityDescriptor=NULL;//必须这样指定,否则没有ZeroMemory的话可能是个非法的值
    HANDLE shm=CreateFileMapping(INVALID_HANDLE_VALUE,&sa,PAGE_EXECUTE_READWRITE,0,20,"myfm");
    if(INVALID_HANDLE_VALUE==shm){
        printf("CreateFileMapping failed\n");
        return 1;
    }
    int *ps=(int*)MapViewOfFile(shm,FILE_MAP_ALL_ACCESS,0,0,20);
    *ps=33;
    UnmapViewOfFile(ps);//这句要不要无所谓
    //CloseHandle(shm);不能在这里Close,CloseHandle使得any error 变成2
    STARTUPINFO StartupInfo;
    ZeroMemory(&StartupInfo,sizeof(STARTUPINFO));
    StartupInfo.cb=sizeof(STARTUPINFO);
    PROCESS_INFORMATION ProcessInformation;
    
    BOOL ret=CreateProcess(_T("..\\Debug\\client.exe"),0,0,0,
        TRUE,CREATE_DEFAULT_ERROR_MODE,0,0,&StartupInfo,&ProcessInformation);
    WaitForSingleObject(ProcessInformation.hProcess,INFINITE);
    if(FALSE==ret){
        printf("%d\n",GetLastError());
        return 1;
    }
    ps=(int*)MapViewOfFile(shm,FILE_MAP_ALL_ACCESS,0,0,20);
    printf("now *ps=%d\n",*ps);
    if(!CloseHandle(shm)){
        printf("CloseHandle failed\n");
        return 1;
    }
    return 0;
}

        子程序代码:

#include "stdafx.h"
#include<Windows.h>
#include<stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
    printf("\nsubprocess entry\n");
    HANDLE hfm=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,"myfm");
    if(INVALID_HANDLE_VALUE==hfm){
        printf("OpenFileMapping failed\n");
        return 1;
    }
    int *ps=(int*)MapViewOfFile(hfm,FILE_MAP_ALL_ACCESS,0,0,20);
    printf("before rewrite,ps=%d,error=%d\n",ps,GetLastError());
    *ps=44;
    UnmapViewOfFile(ps);
    return 0;
}

        运行结果:
subprocess entry
before rewrite,ps=3866624,error=127
now *ps=44
Press any key to continue . . .

漫谈RPC
漫谈组件技术:从OLE到COM到ActiveX到SOAP
Windows RPC编程入门
Windows Com编程入门
Windows编程: 再见MFC
Windows编程: 写一个系统服务
Windows编程 最简单的窗口实例
Windows编程 用MSXML来操纵一个xml文件
Windows平台进程间通信: 剪切板
Windows平台进程间通信: 内存映射
Windows平台进程间通信: dll共享变量
C++编程 Visitor模式(访问者)
C++ 用Ado连接数据库
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载