我想在两个进程间传送字符串,用:WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)这个函数来接收并处理数据,
我知道用oncopydata函数可以,但由于其他功能也是用这个函数来处理消息,所以好像只能用WindowProc来处理数据了
问题是,我该怎么获取另一个进程发送来的字符串?由于水平有限,所以问题描述可能有误,还请指教

解决方案 »

  1.   

    可以用内存映射来进行进程间共享数据,还可以通过自定义消息,WM_USER
      

  2.   

    自定义消息说白了,就是自己定义一个特定的消息,然后在参数中把数据传递过去,相关知识,你可以 参考内存映射通过CreateFileMapping等一系列函数,创建一个命名的内存映射  参考
      

  3.   

    如果字符串多的话,可以放在剪贴板中。
    1,a进程向剪贴板设置信息,然后通过消息通知b进程去获取剪贴板字符串剪贴板数据设置
    CString source;
    //文本内容保存在source变量中
    if( OpenClipboard() )
    {
     HGLOBAL clipbuffer;
     char * buffer;
     EmptyClipboard();
     clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
     buffer = (char*)GlobalLock(clipbuffer);
     strcpy(buffer, LPCSTR(source));
     GlobalUnlock(clipbuffer);
     SetClipboardData(CF_TEXT,clipbuffer);
     CloseClipboard();
    }下面的代码显示了如何从剪贴板上获得文本内容:char * buffer = NULL;
    //打开剪贴板
    CString fromClipboard;
    if ( OpenClipboard() )
    {
     HANDLE hData = GetClipboardData(CF_TEXT);
     char * buffer = (char*)GlobalLock(hData);
     fromClipboard = buffer;
     GlobalUnlock(hData);
     CloseClipboard();
    }
      

  4.   

    只需获得相应窗口的句柄,并发送一个消息就可以了:SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
      

  5.   

    我后来不是给了你参考的网址吗?你可以自己点开来看
    还可以自己去Google搜索下
      

  6.   

    恩,但我还是不明白,内存共享是不是说,发送端发送内存共享的什么,然后在WindowProc中获取消息,再去读取内存?
      

  7.   

    对,获取对方窗口的句柄,然后发送消息。
    对方受到消息后去打开剪贴板,读取数据。窗口句柄获取可以通过FindWindow获取
      

  8.   


    在WindowProc中获取消息,再去读取内存,这个是自定义消息的传递方法,顺带将数据一齐发送了过去。内存映射是在虚存中开辟了一块共享的区域,任何程序,任何时间,都能去那里取数据当然你可以两者配合使用,在获得自定义消息后,就去内存映射中取数据
      

  9.   

    这个又不涉及复杂的运算,原始的API,很快的。
    你可以自己去开辟一个共享区域,也可以直接使用剪贴板。都一样可以达到你的目的
      

  10.   

    LZ别用普通的自定义消息。给你用内存映射文件的源码
    //使用内存映射文件(CreateFileMapping) 读取数据
    //写数据  "DataCHARGE"为内存映射文件名, 在读数据时所用的内存映射文件名应与之一致。
    HANDLE hRecvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
    PAGE_READWRITE | SEC_COMMIT, 0, LENCHARGE, "DataCHARGE");if (hRecvMap != NULL)      // STUDENT* 结构体
    {
      STUDENT* lpData = (STUDENT*)MapViewOfFile(hRecvMap, FILE_MAP_WRITE, 0, 0, 0);
      if (lpData == NULL)
      {
        CloseHandle(hRecvMap);
        hRecvMap = NULL;
    }//写入数据  此处 pCharge 结构体对象, 在执行此操作前应将你的数据值写入pCharge.
    *lpData = pCharge;
    UnmapViewOfFile(lpData);
    lpData = NULL;//CloseHandle(hRecvMap); //退出程序时执行
    ///hRecvMap = NULL;
    }//读数据      此处"DataCHARGE"为映射文件名, 与CreateFileMapping时的文件名一致
    HANDLE m_hReceiveMap = OpenFileMapping(FILE_MAP_READ, TRUE, "DataCHARGE");if (m_hReceiveMap != NULL)  // STUDENT* 为结构体
    {
      STUDENT* lpData=(STUDENT*)MapViewOfFile(m_hReceiveMap, FILE_MAP_READ, 0, 0, 0);  if (lpData == NULL)  //读出数据
      {
        CloseHandle(m_hReceiveMap);
        m_hReceiveMap = NULL;
      }  //如果执行到此处, 说明数据已经读取成功。 可在此处输入 lpData 的值测试一下。
      CloseHandle(m_hReceiveMap);
    } 上面,写数据的代码你写在发送字符串的进程,读数据的代码写在接收字符串的进程。而且,我上面的代码
    是传送结构体STUDENT* lpData,你替换一下为字符串格式即可
      

  11.   

    创建内存映射区域啊,那个参考你看了么,实在不清楚就去查百度“CreateFileMapping”?你想放几块数据就创建几块内存映射做项目,磨刀不误砍柴工。学习是必须的,你那样欲速则不达。你好好去网上看看 内存映射的资料和用法吧
      

  12.   

    进程间通信:IPC(Inter-Process Communication)
    低级通信:信号量和管程机制。其第一个缺点就是传送信息量小,效率低。第二个缺点就是编码复杂。高级通信:共享缓冲区、管道、消息、邮槽,剪贴板1、使用自定义消息 在windows下WM_USER为0x400,如果自定义消息,可以在它上面加上一个值另一种方式来注册消息,就是RegisterWindowsMessage,它的好处就是不必考虑消息标识的表示范围。SendMessage(WM_MyMsg, NULL,(LPARAM)uMsg);2、使用WM_COPYDATA使用指定的结构来发送,接收消息数据typedef struct tagCOPYDATASTRUCT{DWORD dwData;//自定义数据DWORD cbData;//数据大小PVOID lpData;//指向数据的指针}COPYDATASTRUCT;COPYDATASTRUCT cpd;cpd.dwData = 0;   cpd.cbData = length; cpd.lpData = Buffer;SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd); 3.使用内存读写WriteProcessMemory, ReadProcessMemory在进程内存使用VirtualAllocEx通过进程句柄来分配一个空间,使用WriteProcessMemory将信息写入该进程的内存,然后利用消息,将这块内存的基址发送给目标进程,目标进程使用ReadProcessMemory来读取该进程的该块内存. 4、使用内存映射 通过CreateFileMapping 来 创建一段内存映射如CreateFileMapping(0xFFFFFFFF, 0, PAGE_READWRITE, highsize,lowsize,Name);LPSTR basepointer =  (LPSTR)MapViewOfFile(m_hMapObj, FILE_MAP_READ,0 ,0,0);在另一个进程OpenFileMapping来打开该共享内存,MapViewOfFile来获取指针,读取之后使用UnmapViewOfFile释放映射,CloseHandle(hMapObj);并关闭句柄 5、使用DLL通信
    在dll中建立一个新段来共享数据#pragma data_seg("MyShared") char m_str[256] ;#pragma data_seg()#pragma comment(linker,"/SECTION:MyShared,RWS") 6、使用windows剪贴板 
    BOOL OpenClipboard();//打开剪贴板BOOL CloseClipboard();//关闭剪贴板BOOL EmptyClipboard();//清空剪贴板HANDLE SetClipboardData();//按指定数据格式放置剪贴板数据,用之前必须使用OpenClipBoard函数BOOL IsClipboardFormatAvailable(UNIT uFormat);7、使用消息管道服务程序:CreateNamedPipe创建命名管道CreateNamedPipe("\\\\.\\pipe\\ssnp\\",RIGHTS,BLOCK_MODE,PIPE_UNLIMITED_INSTANCES,128,128,NULL,NULL);创建线程来监听管道连接管道ConnectNamedPipe(pipe_handle,..);ReadFile,WriteFile....读写内容客户程序:打开管道使用CreateFile使用ReadFile WriteFile来读写内容8、使用邮槽通信CreateMailslot:创建邮槽GetMailslotInfo//阻塞等待数据ReadFile WriteFile收发数据完全类似于管道机制9、使用windows套接字通信全地球人都知道怎么写,就不细说了初始化winsock检查winsock版本服务器端:socket->bind->listen->accept....>read....>write...close客户端socket->connect....>write...>read....>close
    文章出处:http://www.diybl.com/course/3_program/c++/cppsl/20071215/92160.html
      

  13.   

    内存映射文件是最好的方法,用剪贴板是一个危险的方法,因为剪贴板是整个系统共用的,如果有其它程序要用到的话就麻烦了.
    另外,上面有说用自定义消息的,这个是不行了,自定义消息怎么传字符串呢?传过去的地址又不能用,自定义消息只能是起辅助作用.另外:这一句话我没看明白:
    我知道用oncopydata函数可以,但由于其他功能也是用这个函数来处理消息,所以好像只能用WindowProc来处理数据了 
    用WM_COPYDATA消息为什么不行呢?这个是最简单的方法了!
      

  14.   

    原来WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)这个可以获取数据,
    COPYDATASTRUCT *c = (COPYDATASTRUCT*)lParam;
    LPCSTR str =  (LPCSTR)(c->lpData);但现在接收到的数据是乱码
      

  15.   

    http://blog.csdn.net/lziog/archive/2009/04/28/4132624.aspx
    这个讲内存映射已经很详细了