我正在使用重叠I/O读取和写入串行端口。当从命令提示符执行exe时,程序会崩溃(“xxxx.exe遇到问题,需要关闭...”)。使用这个代码块并且是应用程序崩溃的地方在它崩溃之前被调用了好几次,并且工作得很好。奇怪的是,当我在调试模式下从VC++ 2010运行可执行文件时,它不会崩溃。GetOverlappedResult()在运行时崩溃,但从VC++ 2010调试时不崩溃
这是其中GetOverlappedResult()崩溃代码块...
memset(&ov, 0, sizeof(OVERLAPPED));
ov.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
if(!Comm.Read(lpbBuffer, 1, &dwBytesRead, &ov))
if(GetLastError() != ERROR_IO_PENDING)
return FALSE;
if(!Comm.GetOverlappedResult(&ov,&dwBytesRead,TRUE))
{
printf("Resync: Comm.GetOverlappedResult() failed with error code %u\n", GetLastError());
return FALSE;
}
Comm.GetOverlappedResult()源
BOOL SerialAsync::GetOverlappedResult(LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait)
{
printf("made it here\n");
BOOL ret = ::GetOverlappedResult(hComm, lpOverlapped, lpNumberOfBytesTransferred, bWait);
printf("made it here too\n");
return ret;
}
我有确保hComm,重叠的结构和指向lpNumberOfB的指针ytesTransferred有效。
编辑
添加调试环境变量后,程序将在调试器崩溃...调试器中的#ifdef后打开文件tidtable.c并指向的第一行代码
/***
* __set_flsgetvalue - crt wrapper for setting up FlsGetValue pointer in TLS
*
* Purpose:
* This function helps msvcmXX.dll threadstart and threadstartex APIs
* to set FlsGetValue pointer before calling __fls_getvalue.
*
*******************************************************************************/
_CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()
{
#ifdef _M_IX86
PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;
if (!flsGetValue)
{
flsGetValue = DecodePointer(gpFlsGetValue);
TlsSetValue(__getvalueindex, flsGetValue);
}
return flsGetValue;
#else /* _M_IX86 */
return NULL;
#endif /* _M_IX86 */
}
EDIT2
这是正在被调用的函数它终止
之前BOOL Resync(LPBYTE lpbBuffer)
{
DWORD dwBytesRead;
while(Comm.Read(lpbBuffer, 1, &dwBytesRead))
if(DDCMP_SOH == *lpbBuffer || DDCMP_ENQ == *lpbBuffer)
return TRUE;
return FALSE;
}
这是我已经改变了我AsyncSerial ::阅读()命令是
BOOL SerialAsync::ReadOverlapped(LPBYTE lpbBuffer, DWORD dwSize, LPDWORD dwBytesRead, LPOVERLAPPED lpOverlapped)
{
return ReadFile(hComm, lpbBuffer, dwSize, dwBytesRead, lpOverlapped);
}
BOOL SerialAsync::Read(LPBYTE lpbBuffer, DWORD dwSize, LPDWORD dwBytesRead)
{
BOOL bResult = TRUE;
OVERLAPPED ov;
memset(&ov, 0, sizeof(OVERLAPPED));
ov.hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
if(!ReadOverlapped(lpbBuffer,dwSize,dwBytesRead,&ov))
bResult = GetLastError() == ERROR_IO_PENDING;
if(bResult)
bResult = GetOverlappedResult(&ov,dwBytesRead,TRUE);
CloseHandle(ov.hEvent);
return bResult;
}
我们需要更多的代码。什么'SerialAsync :: Read'看起来像? 'ov'变量的生命周期是多少?接触'ov'的每一段代码是什么? –