MFC对话框转化为dll导出函数的问题,原WSAAsyncSelect获取不到消息~
两种方法,一种是,不用对话框了,直接在导出类中用WSAAsyncSelect,和socket初始化,结果WSAAsyncSelect老是失败,很郁闷,
第二种,,我原来是写成MFC对话框程序,已经是可以运行的一个类似聊天的客户端,,,重新建MFC DLL,添加一个mfc对话框类,把原来的代码COPY进这个对话框类,编译都正常,,消息也发的出去,就是WSAAsyncSelect接收不到消息,,
(第一种方法 WSAAsyncSelect 直接失败 返回10022错误,,第二种 感觉好一些,WSAAsyncSelect 初始化成功了,但是确接收不到消息,)
郁闷了好几天~~~~

解决方案 »

  1.   

    extern "C" __declspec(dllexport) int INIT()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    m_CMySocket.InitSrvSocket();
    if(SOCKET_ERROR==WSAAsyncSelect(m_CMySocket.m_SrvSocket,NULL,UM_SOCK_GETS,FD_READ))
    {
    MessageBox("注册网络读取事件失败!");
    return 1;
    }
           return 2;
    }
    这是第一种方法 WSAAsyncSelect 直接失败 返回10022错
    extern "C" __declspec(dllexport) int INIT()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CFMDlg *pDlg=new CFMDlg(); 
    pDlg->Create(IDD_DIALOGXX); 
    pDlg->ShowWindow(SW_SHOW);
    }
    这个是第二种~~ WSAAsyncSelect 在对话框里初始化成功了,但是确接收不到消息
      

  2.   

    理论上讲,应该是你没考虑好变量的作用域的问题。解决方法是在dll外部声明socket,然后在dll处理。比如,你要初始化socket,最好将其作为引用参数传递进去,初始化函数的声明你可以写成这个样子:int   INIT(SOCKET sock,..........) ;
    试试这种方法看可以不。dll一般只封装函数,不封装变量,变量在dll外部声明内部实现。