VC的Debug窗口中提示:
First-chance exception in HHCTC.exe (RPCRT4.DLL): 0xC0000005: Access Violation.
这是调用的函数。
BOOL CSDIViewView::OnAlarmSConn(CString strQuestionIP, int m_iPort)
{
closesocket(m_hAlarmsocket);

if ((dwIPAddr=inet_addr(strQuestionIP))==INADDR_NONE)
{
return FALSE;
} else
{
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(m_iPort);
sockAddr.sin_addr.S_un.S_addr = dwIPAddr;
for(int i=0;i<8;i++)
sockAddr.sin_zero[i] = 0;
if ((m_hAlarmsocket = socket(AF_INET, SOCK_STREAM, 0))==INVALID_SOCKET)
{
closesocket(m_hAlarmsocket);
m_hAlarmsocket = NULL;
return FALSE;
} if (connect(m_hAlarmsocket, (LPSOCKADDR)&sockAddr, sizeof(sockAddr))==SOCKET_ERROR)
{
closesocket(m_hAlarmsocket);
m_hAlarmsocket = NULL;
return FALSE;
}

int iErrorCode = WSAAsyncSelect(m_hAlarmsocket, m_hWnd, UM_ALARMSOCKET_READ, FD_READ);
if (iErrorCode==SOCKET_ERROR)
{
closesocket(m_hAlarmsocket);
m_hAlarmsocket = NULL;
return FALSE;
}
}
return TRUE;
}

解决方案 »

  1.   

    哪里错不好说。不过有些建议:
    调用closesocket(m_hAlarmsocket);时,最好先判断一下m_hAlarmsocket是否为空。因为有些函数如果句柄为空的话,可能会有错误。
      

  2.   

    看了半天,我觉得单凭这些代码不会出现这样的问题能有个调试环境就好了,要不楼主把代码发给我我给你调一下[email protected]
      

  3.   

    先谢谢两位。
    这有些难办了,代码太多了。总共一了几M恐怕发不了。我把线程代码一起帧出来。帮忙看看。
    void _cdecl CSDIViewView::CycleThread(LPVOID window)
    {
    MSG msg;
    DWORD n = 0;
    BOOL result; CoInitialize(NULL);
    CSDIViewView* pThread = (CSDIViewView*)window;
    pThread->CycleThreadId = GetCurrentThreadId(); for(;;)
    {
    result = WaitForSingleObject(pThread->event1,20);
            if(result != WAIT_TIMEOUT)
    break; if (::GetMessage(&msg, NULL, 0, 0)==-1)
    continue; if (msg.message == UM_CLOSE)
    {
    TRACE("\nEND CycleThread!\n");
    break;
    } if (msg.message != UM_CYCLE && msg.message!=UM_ALARM)
    continue;
    if (msg.message==UM_CYCLE)
    {
    if (pThread->m_bCycleAlarmEnd==FALSE && 
    pThread->m_bCurAlarmEnd==TRUE)
    {
    n = ConnectionTest(GetIPAddress( GetEccAddress( (int)msg.wParam ) ));
    if (pThread->nSendData!=100)
    {
    if (n==1)
    {
    if (!pThread->OnAlarmSConn(pThread->strCycleIP, 10001))
    n = 10;
    }
    pThread->PostMessage(UM_SENDCYCLEALARM, n, 0);
    }
    else
    break;
    }
    pThread->m_bCycleAlarmEnd = TRUE;
    }
    if (msg.message==UM_ALARM)
    { if (pThread->m_bCurAlarmEnd==FALSE)
    {
    n = ConnectionTest(GetIPAddress( GetEccAddress( (int)msg.wParam ) ));
    n |= msg.wParam<<16;
    if (pThread->nSendData!=100)
    pThread->PostMessage(UM_SENDCURALARM, n, 0);
    else
    break;

    }
    pThread->m_bCurAlarmEnd = TRUE;
    }
    }
    TRACE("\nEnd-thread");
    closesocket(pThread->m_hAlarmsocket);
    WSACleanup();
    CoUninitialize();
    TRACE("线程CSDIViewView::CycleThread安全退出\n");
    SetEvent(pThread->m_hQuitEvent);
    _endthread();
    //ExitThread(0);
    }
      

  4.   

    因为加上了这个调用之后程序就出现了上面的那个错误,如果不加的话,就没有问题。
    if (!pThread->OnAlarmSConn(pThread->strCycleIP, 10001))
    另外程序运行过程序,进行窗口切换,还会出现另外一个错误提示:
    First-chance exception in HHCTC.exe (NTDLL.DLL): 0xC0000005: Access Violation.
    我真不明白这是为什么,但是奇怪的是,这些错误提示并不影响程序正常运行。
      

  5.   

    错误位置就是这里:if (!pThread->OnAlarmSConn(pThread->strCycleIP, 10001)),去掉它就没的提示,加上就有了。可是我需要这个调:(
      

  6.   

    嗯。那你跟踪一下看看
    if (!pThread->OnAlarmSConn(pThread->strCycleIP, 10001)),和OnAlarmSConn函数里面的各个参数都是否有效呢?
      

  7.   

    在pThread->OnAlarmSConn(pThread->strCycleIP, 10001)这个函数中,是否有类似的UpdateData,或者直接对界面中的控件进行操作的代码
      

  8.   

    楼主可以跟一下在OnAlarmSConn里那一句出的错,最好用call stack查一下
      

  9.   

    这个函数的代码我在最前面贴出来了。没有与界面操作相关的地方,只是个网络连接,绑定。而且最不能理解的是运行下面这个连接函数之后,就出现了那个错误提示
    if (connect(m_hAlarmsocket, (LPSOCKADDR)&sockAddr, sizeof(sockAddr))==SOCKET_ERROR)Debug:First-chance exception in HHCTC.exe (RPCRT4.DLL): 0xC0000005: Access
      

  10.   

    这个函数是winsocket里面的库函数,不是我自已写的。