前两天有个题目是关于文件内存映射的,在网上搜集了一些代码,修改成了通过文本输入框使得两个进程间进行相互通信。进程间的相互通信,可以通过调用以下api函数实现:CreateFile()、CreateFileMapping()、MapViewOfFile()、FlushViewOfFile()、CloseHandle()、UnmapViewOfFile()。以下是我的参数配置:

bool initial_read_file(){
    hFile = CreateFile("C:/text.txt",  GENERIC_READ | GENERIC_WRITE,                                         

                                       FILE_SHARE_READ | FILE_SHARE_WRITE,   NULL,    OPEN_EXISTING,
                                       FILE_ATTRIBUTE_NORMAL,  NULL);
 
if(INVALID_HANDLE_VALUE == hFile){
        return false;
 }
 
 hFileMap = CreateFileMapping(hFile,  NULL,   PAGE_READWRITE,    0,    1024*10,    NULL);


  if(NULL == hFileMap){
         return false;
    }
   
    pVoid = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
 
  if(NULL == hFileMap){
          return false;
    }

 ::ZeroMemory((char *)pVoid, sizeof(pVoid));

 FlushViewOfFile(pVoid, sizeof(pVoid));

 return true;
}
此时将文件内容装载到了内存中,此时就可以想文件中写内容。

   memcpy((char *)pVoid, _String, sizeof(_String));
   FlushViewOfFile(pVoid, sizeof(pVoid));
pVoid指向的是文件内存的指针,第一句话以后内存中的内容还没有写到了硬盘上,所以需要调用FlushViewOfFile函数。否则就会出现你第一次发送的内容,对方第二次才能接收到。

以上就是文件内存映射的使用方法了,但是现在的问题是进程间要通信的话。进程一想文件中写内容了,就需要告诉进程二,下面介绍以消息的方式通知它。本人由于也是对win32 Application不是很熟悉,也不想打算使用MFC,所以界面功能比较简单。

当摁下enter键的时候,通过下面两个函数进行发送消息:

                            pWndRecv = CWnd::FindWindow(NULL,TEXT("MainWindowClass1"));
                            pWndRecv->SendMessage(WM_COPYDATA,NULL,NULL);
第一条的第二个参数是窗口名MainWindowClass1(也就是第二个进程的窗口名),如果该进程在运行,那么返回值不为空,否则程序就会崩溃掉。第二句话的意思是发送消息WM_COPYDATA到进程二的窗口。注意此时用到了MFC函数,需要对项目进行设置(Visual C++ 6.0)。project->setting中的c/c++标签中的category中设置为Cide Generation,在下面的Use run-time library中设置为debug Multithreaded。

第二个进程接受到消息以后,更新窗口以显示消息。