读书人

Gh0st源码接收消息的静态函数内调用对

发布时间: 2012-09-24 13:49:41 作者: rapoo

Gh0st源码接收消息的静态函数内调用对话框类里的成员变量、函数出现问题
在Gh0st 的 static void ProcessReceiveComplete(ClientContext *pContext,CRadDlg * pRadDlg) 函数中加了一个指向对话框的指针pRadDlg,Iocpserver中的NotifyProc接收到数据时调用 ,但为什么使用pRadDlg调用成员函数或成员变量还有发送消息都有错误呢;


运行后,有客户端发送消息过来直接挂了,在调用的地方
如是下详图;供大家参考;
客户端服务端源代码见附件;拜托

C/C++ code
//此处是接收的函数,有客户端发送数据会在此处响应void CALLBACK CRadDlg::NotifyProc(LPVOID lpParam, ClientContext *pContext, UINT nCode){        try        {                CRadDlg* pFrame = (CRadDlg*) &lpParam;  //CRadDlg的this指针                CString str;                g_iocp = &pFrame->m_iocpServer;                switch (nCode)                {                case NC_CLIENT_CONNECT:                        {                        }                        break;                case NC_TRANSMIT:                        break;                case NC_RECEIVE:                        //        ProcessReceive(pContext);                        break;                case NC_RECEIVE_COMPLETE:                        {                        ProcessReceiveComplete(pContext,pFrame);  //第一步,此处返回完整数据时调用                         break;                }        }catch(...){}}第二步, 本打算通过 pRadDlg调用CRadDlg指针的函数void ProcessReceiveComplete(ClientContext *pContext,CRadDlg * pRadDlg){        if (pContext == NULL)                return;        // 如果管理对话框打开,交给相应的对话框处理        CDialog        *dlg = (CDialog        *)pContext->m_Dialog[1];        switch (pContext->m_DeCompressionBuffer.GetBuffer(0)[0])        {         case TOKEN_LOGIN: // 上线包*/                {                        pRadDlg->PostMessage(WM_ADDTOLIST, 0, (LPARAM)pContext);  第三步,但当新客户端上线时,此处便出错找不出其原因,望各路高人解答;                         BYTE        bToken = COMMAND_ACTIVED;                }                 break;         default:                 closesocket(pContext->m_Socket);                 break;         }        }


void ProcessReceiveComplete(ClientContext *pContext,CRadDlg * pRadDlg);
本来是静态函数,出现上面问题,我改成了全局的,问题同在;
照说静态函数没有this指针,且只能调用静态的东东,但我在参数中传递了一个当前对话框类的指针,照理是可以调用的,但每次一运行到上面第三步就出错,不明真相。。。。

[解决办法]
CRadDlg* pFrame = (CRadDlg*) &lpParam; //CRadDlg的this指针
这个就不对了吧,lpParam是什么呢?
g_iocp = &pFrame->m_iocpServer;这个也不对

怎么向NotifyProc传参数的?
[解决办法]
pRadDlg->PostMessage(WM_ADDTOLIST, 0, (LPARAM)pContext);

用::PostMessage 看看,句柄用pRadDlg->GetSafeHwnd()看看

读书人网 >VC/MFC

热点推荐