遇到这样一个问题:client进程需要调用一个DLL与server进程进行数据通信(需要发/收大的数组),我对windows系统编程所知不多,请教大家这种情况下应该怎么操作?使用内存共享的话,DLL如何通知server数据已经写到共享内存中了?同样对server,它又如何通知DLL数据已经写到共享内存中了呢?

解决方案 »

  1.   

    你client通知server就可以,为什么非得dll通知呢?
      

  2.   

    DLL 封装通信的Client 模块就可以了
    其他 IP,端口,等 当参数传进去
      

  3.   

    因为client是已经编译好的软件,不能修改,只能通过DLL进行扩展。
      

  4.   

    你采用共享内存,你的client和server在一台机器上吗?如果是的话,可以看作2个进程间的通讯啊,有很多办法啊,发消息吧。
      

  5.   

    自定义消息,写到共享内存后,发自定义消息给另一个进程,另一进程收到后读就可以了。或者用SOCKET,内存映射文件,管道等进程通信方法。
      

  6.   

    能再详细点说说吗?补充一下,现在client进程,dll和server进程都在本机,所以不需要进行IP通信
      

  7.   

    那server进程怎么通知dll呢?也是一样处理吗?
      

  8.   

    给你写个例子
    DLL中#define WM_GETMESSAGE      WM_USER+112 //自定义消息
    HANDLE hMapping;   
    LPWSTR lpData;   
    hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x1000,"MYSHARE");   
    if(hMapping!=NULL)
    {
    lpData=(LPWSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
    if(lpData!=NULL)
    {
    swprintf(lpData,L"%s","你要写的数据");
    //给主线程发送消息 g_hMain是目标进程的窗口句柄
    PostMessage(g_hMain,WM_GETMESSAGE,NULL,NULL);

    }
    UnmapViewOfFile(lpData); 
    }
    接收的进程
    LRESULT CMainDlg::OnReceiveMessage(WPARAM wParam, LPARAM lParam)
    {
        HANDLE hMapping; 
        LPWSTR lpData; 
        hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x1000,"MYSHARE");
    if(hMapping!=NULL)
    {
    lpData=(LPWSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
    if(lpData!=NULL)
    {
       CString strText(lpData);
                       //处理接收到的数据
                      .......
    }
    UnmapViewOfFile(lpData);
    }
    return true;
    }
      

  9.   

    自定义消息,写到共享内存后,发自定义消息给另一个进程,另一进程收到后读就可以了。或者用SOCKET,内存映射文件,管道等进程通信方法。
      

  10.   

    拜一个先。还是前面的问题,server进程怎么通知dll呢?也是一样处理吗?dll没有窗口句柄吧?
      

  11.   

    dll导出一个接口,主程序调用也可以。最好是用Socket,方便。
      

  12.   

    用Socket或管道在主程序和dll中分别开一个线程用来接收和发送数据就不用发自定义消息了。有数据到就会接收进来。
      

  13.   

    能详细说说吗?dll怎么导出“接口”,“主程序调用”又是什么意思?