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;
}
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;
}
调用closesocket(m_hAlarmsocket);时,最好先判断一下m_hAlarmsocket是否为空。因为有些函数如果句柄为空的话,可能会有错误。
这有些难办了,代码太多了。总共一了几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);
}
if (!pThread->OnAlarmSConn(pThread->strCycleIP, 10001))
另外程序运行过程序,进行窗口切换,还会出现另外一个错误提示:
First-chance exception in HHCTC.exe (NTDLL.DLL): 0xC0000005: Access Violation.
我真不明白这是为什么,但是奇怪的是,这些错误提示并不影响程序正常运行。
if (!pThread->OnAlarmSConn(pThread->strCycleIP, 10001)),和OnAlarmSConn函数里面的各个参数都是否有效呢?
if (connect(m_hAlarmsocket, (LPSOCKADDR)&sockAddr, sizeof(sockAddr))==SOCKET_ERROR)Debug:First-chance exception in HHCTC.exe (RPCRT4.DLL): 0xC0000005: Access