如题,为了让用IE5.0的人也能看见题目,把内容发到第一贴。谢谢

解决方案 »

  1.   

    在WinInet编程我用了InternetCallbackFunc回调来实现异步调用,
    但是遇到一个问题,我很菜,找不到好的解决的方法。请大家指教
    指教。我写了一个CWebGrabEx类,没有用MFC,在初始化时有m_pOldCallback = ::InternetSetStatusCallback(
                                m_hSession,
                                (INTERNET_STATUS_CALLBACK) InternetCallbackFunc
                                );
    在回调函数:
    void CALLBACK CWebGrabEx::InternetCallbackFunc(....)
    {
        ................
        static nRequestCompleteID = 0;    // Act on status code.
        switch(dwInternetStatus)
        {
        case INTERNET_STATUS_RESOLVING_NAME:
            // Use pStr to point to the value.
            TRACE(">>>>>>>  INTERNET_STATUS_RESOLVING_NAME.\n");
            break;
        ....................
        // nRequestCompleteID 会改变
        }
    }在这个类的成员函数WaitForGrabFinished():int CWebGrabEx::WaitForGrabFinished()
    {
        while(g_nRequestCompleteID != -1
            && g_nRequestCompleteID != -2
            && ( (m_nNowTime = GetTickCount()) - m_nOldTime < m_nTimeOut*1000)
            )
        {
            Sleep(200);
        }
        ................
    }我在回调里面要使用一个nRequestCompleteID记录当然回调执行的状态,
    但是这个值在这个类里面也要使用,我应该怎么定义?我现在用一个全局变量g_nRequestCompleteID来实现共享,但是这样如果我
    创建几个同样类的话,就会乱套了。有没有好的解决办法?我也可以创建一个
    类似MAP的数组记录nRequestCompleteID,让100个线程的记录值互不影响,
    但是这样做不是最好的办法。
      

  2.   

    把nRequestCompleteID的指针作为回调函数的参数传递进去不就行了?
      

  3.   

    回调是m_hSession自己调用的,你不会是说自己定义一个消息,直接调用回调函数吧。好像可以哦 是这样吗?
      

  4.   

    void CALLBACK InternetStatusCallback(
      HINTERNET hInternet,
      DWORD_PTR dwContext,
      DWORD dwInternetStatus,
      LPVOID lpvStatusInformation,
      DWORD dwStatusInformationLength
    );里面的dwContext就可以用啊
      

  5.   

    我还是放到
    LPVOID lpvStatusInformation里吧,INTERNET_ASYNC_RESULT iar;
    iar.dwResult = (DWORD)&m_nRequestCompleteID;
    iar.dwError = 0;
    InternetCallbackFunc(
                        m_hSession,
                        (DWORD)this,
                        INTERNET_STATUS_TRANS_REQUESTCOMPLETEID,
                        (LPVOID)&iar,
                        sizeof(INTERNET_ASYNC_RESULT)
                        );