怎么在进程间交换复杂数据类型数据?
我需要共享的数据中一般定义如下:
typedef struct
{
char *szBuffer;
LPVOID *lpp;
int iSize;
}SHAREDATA, LPSHAREDATA;
请问各位大侠,通过内存映射文件及其其它方式怎么做到跨进程间共享或交换数据,高分求教,有实现最佳,不够可以另外开专题加分。

解决方案 »

  1.   

    Clipboard 
    COM 
    Data Copy 
    DDE 
    File Mapping 
    Mailslots 
    Pipes 
    RPC 
    Windows Sockets 
    database
      

  2.   

    32位系统下使用进程间共享内存映象文件这个实例创建两个简单的应用程序,服务器程序在共享内存中写一字符串,等待更长字符串的写入。客户程序接着读共享内存,并写一新字符串到共享内存并退出。 1、创建服务器程序 首先选择菜单 File | New ,在New Item 对话框中选择 Consol Wizard,在弹出的Consol Wizard 对话框中,去掉"Use VCL"的选项。 在Unit1.cpp众加入以下代码: //---------------------------------------------------------------------------   
    #include   
    #include   
    #include   
    #include   
    #pragma hdrstop   
      
    //---------------------------------------------------------------------------   
      
    #pragma argsused   
    int main(int argc, char* argv[])   
    {   
      HANDLE hMapping;   
      LPSTR lpData;   
      
      hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"MYSHARE");   
      if(hMapping==NULL)   
      {   
         cout<<"CreateFileMapping() failed.";   
         exit(1);   
      }   
      lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);   
      if(lpData==NULL)   
      {   
         cout<<"MapViewOfFile() failed.";   
         exit(1);   
      }   
      sprintf(lpData,"Server Data String");   
      while(strlen(lpData)<20)   
         Sleep(1000);   
      cout<<"Received:"<   UnmapViewOfFile(lpData);   
      return 0;   
    }   
    //--------------------------------------------------------------------------- 
    2、创建客户应用程序 如同创建服务器程序一样,创建一个新的控制台项目文件,在Unit2.cpp中,加入以下代码: //--------------------------------------------------------------------------- 
    #include 
    #include 
    #include 
    #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused 
    int main(int argc, char* argv[]) 

      HANDLE hMapping; 
      LPSTR lpData;   hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"MYSHARE"); 
      if(hMapping==NULL) 
      { 
         cout<<"CreateFileMapping() failed."; 
         exit(1); 
      } 
      lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0); 
      if(lpData==NULL) 
      { 
         cout<<"MapViewOfFile() failed."; 
         exit(1); 
      } 
      cout<<"Server Data:"<   sprintf(lpData,"My Client data string that is longer than 20"); 
      UnmapViewOfFile(lpData); 
      return 0; 

    //--------------------------------------------------------------------------- 
      

  3.   

    Serialize啊,去看MFC怎么实现的
      

  4.   

    如果数据量不大,可以使用WM_COPYDATA 消息大量数据请使用内存映射文件
      

  5.   

    这种序列化的工作确实比较麻烦,如果用MFC的那种方式也不可取,因为可能有很多不同的结构要传递,每个结构都编写自己的序列化那多费事,况且还存在结构中存在指针的指针等。这个问题应该有个统一的解决方法才对,微软自己的操作系统也会遇到同样的问题。可能微软内部的代码是可以在ring 3级跨进程读取内存的,以前看到一篇文章说微软的某些内核代码把2G以上的一段内存映射到2G以下,从而可以通过普通的EXE来访问ring 0级使用的内存。
      

  6.   

    我也希望能够有人来回答这个问题,简单的把楼主的要求重复下:
    1、能够在进程间传递复杂结构
    2、结构里面可能存在着指针、指针的指针,直到好几级指针。要求把每级指针的内容都能够传递过去。
    3、结构有很多个,并不是一两个结构,所以需要通用的做法。如果针对每个结构都Serialize,那工作量很大,不采取这种方式。微软COM里面的IDL语言对传递结构的方式也要每个结构都在IDL中对应重新定义,不知是否真的就没有办法达到同一个进程内访问结构那样简单。