导出类
有没有好的模式?

解决方案 »

  1.   

    使用 wsaeventselect 或者 select模型
    但是如何通知调用者呢?
      

  2.   

    我觉得还是用ocx好吧   因为ocx有事件通知 如果有什么网络事件 可以通知ocx的宿主文件  我之前写过一个专门负责通信的ocx  是用select+socket写的  通信所需要的信息是宿主文件通过调用ocx的接口函数传进来的   如果通信完成 就会触发事件通知宿主文件  然后宿主文件就会调用ocx的函数 将数据读上来  通信的模型是发出请求 然后在select里定时接收  如果超时 就按无响应处理
      

  3.   

    使用 wsaeventselect 或者 select模型,需要有接收网络消息的注册窗口句柄,及自定义的消息,在DLL中提供一个函数,函数参数为句柄和自定义消息,应用程序中调用此函数把接收消息的窗口及自定义的消息当作参数传递给DLL,这样就行了
      

  4.   

    DLL中的导出函数中,通过一个参数把接收网络事件的窗口句柄传递进去,当select等触发时,触发消息给窗口
      

  5.   

    调用者注册了回调函数,dll导出类是可以直接通知调用者的
    可是网络通信那是个新的线程,要求双端通信新线程里面的数据如何通过导出类通知到调用者呢?
      

  6.   

    我发段代码上来吧
    CCore是导出类
    typedef int(*EventCallBack)(EVENTDATA* pData);
    EventCallBack CallBackFun;都是类成员
    调用者注册回调
    int CCore::funRegEvent(DWORD dwFun)
    {
    CallBackFun=(EventCallBack)dwFun;
    return 1;
    }
    //调用者调用登陆函数
    int CCore::funLogin(const char* pszID,const char* pszPWD,int nState)
    {
    //启动通信线程 
          HANDLE hw=CreateThread(NULL,0,ThreadFun,(LPVOID)this,0,0);
    if(hw)
    {
    CloseHandle(hw);
    }
       return 0;
    }
    ThreadFun 线程函数需要双端通信,获取的数据如何通过CCore对象传递到调用者呢?
    调用者又该如何通过CCore对象通过ThreadFun 向外发送消息呢?
      

  7.   

    ThreadFun 函数中,根据传入的this,获得CallBackFun,从而获得调用者的回调,线程中就可以调用回调
      

  8.   

    或者说
    CCore 怎么直接和ThreadFun 线程函数通信吧?
    ThreadFun 函数怎么设计好呢?
    DWORD WINAPI ThreadFun (LPVOID lpThreadData)
    {
     CCore* pCoreObj=(CCore*)lpThreadData;
     InitSocket(pCoreObj->m_Socket);
     ConnectToRemote(IP,Port);
     //使用select
    fd_set readfds;
    fd_set writefds;
    timeval to;
    to.tv_sec = 0;
    to.tv_usec = 30000;//30秒超时
    int nSelectResult=SOCKET_ERROR;
    while(true)
    {
    FD_ZERO( &readfds );
    FD_ZERO( &readfds );
    FD_SET(pCoreObj->m_Socket, &readfds );
    FD_SET(pCoreObj->m_Socket, &writefds );
    nSelectResult=select(0, &readfds, &writefds, NULL, &to);
    switch(nSelectResult)
    {
    case SOCKET_ERROR: 
    break;
    case 0://timeout
    break;
    default:
    {
    if (FD_ISSET(pCoreObj->m_Socket, &readfds))
    {
    recv()//?
    }
    if (FD_ISSET(pCoreObj->m_Socket, &writefds))
    {
    send()//?

    }
    }
    break;
    }//switch
    }
    }
      

  9.   

    调用者又该如何通过ThreadFun 向外发送消息呢?整个模块是我设计的,不知道这样又没有问题啊
      

  10.   

    ocx 处理起来是不是有点慢?
      

  11.   

    可以通过接口的形式,在通信类的消息处理时调用接口的函数接口,
    在外面调用DLL的类继承接口并实现接口,通过DLL的导出函数绑定接口指针以及通信类发送消息
      

  12.   


    class __declspec(dllexport) CCore
    {
    }
    所以说调用者直接调用CCore中的方法是没问题的
    调用者注册回调函数后,CCore对象也可以直接通知调用者了
    现在问题是,调用者如何操作 工作线程
      

  13.   

    调用者调用CCore的一个方法,然后PostThreadMessage发送消息给线程
      

  14.   

    使用回调函数,导出一个函数让用户(DLL的使用者)注册该回掉函数(主要是传些用户自己的数据,方便用户实现回掉函数)。
    当你主动通知用户时(比如收到数据需要传给用户)就调用该回调函数,用户在回掉函数得到信息(比如你收到的网络数据)后,用户自己在回掉函数做处理。
    当用户有数据传给你时,直接调用你导出的接口函数。
    这样达到了你和用户的双向通信都有问题了。
      

  15.   


    我就是这么设计的
    现在是工作线程和dll导出类怎么通信的问题
      

  16.   

    这个不是前面就说了,你线程中传递了CCore的this 指针,线程中就可以调用CCore的dll导出类对象,这样不就通信了。