现在开机时不时就冒出来,关了又 弹出来,什么意思啊?
请问这是什么意思?
- 提问者网友:愿为果
- 2021-05-06 07:41
- 五星知识达人网友:平生事
- 2021-05-06 08:14
出现该问题,一般都是因为使用了MFC的套接字类。
参考一: http://topic.okbase.net/200612/2006122010/2821315.html
一种情况肯定会导致上面的问题,即:
如果系统执行到CAsyncSocket::DoCallBack函数的
pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET, FALSE);语句时,得到的pSocket指针还是为空,系统将会抛出异常,而异常被捕获到之后,就会弹出上面的错误提示窗口!
"关于An invalid argument was encountered" http://hi.baidu.com/%C1%E8%D4%C6%D7%B7%B7%E7/blog/item/1f58780855f019900b7b8231.html
这里认为是变量初始化导致的。这个有可能。我一般都会进行变量初始化的,因为以前也遇到过变量初始化导致的奇怪问题。但是,代码一多,偶尔也会忘记。
我还是坚持自己的看法。因为这是一个异常处理代码弹出的对话框。从其字面意思来看,是在链表节点查询时,使用了非法的句柄!
进一步分析。
查询MFC的源码,在map_pp中,找到了这句抛出异常的代码。如下:
void* CMapPtrToPtr::GetValueAt(void* key) const
// find value (or return NULL -- NULL values not different as a result)
{
ENSURE(this); //这里会抛出异常
if (m_pHashTable == NULL)
return NULL;
UINT nHash = HashKey(key) % m_nHashTableSize;
// see if it exists
CAssoc* pAssoc;
for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
{
if (pAssoc->key == key)
return pAssoc->value;
}
return NULL;
}
ENSURE(this); 等价于如下代码:
int __afx_condVal=!!(this);
ASSERT(__afx_condVal);
if (!(__afx_condVal))
{
::AfxThrowInvalidArgException();
}
!!(this); 这种写法我还是第一次看见,其实就是判断this指针是否为空。如果为空,就抛出异常。
为了确认是在这里出的问题,就得跟踪调试,但是问题具有随机性,可能几个小时都不出现的。而且,这种问题很可能是仅仅在release版本中出现!
误区。
因为之前也曾遇到过类似的情况,当时是CAsyncSocket::DoCallBack函数出了问题。这次,在遇到了同样的问题之后,由于思维定式,我就死盯着这个函数不放,导致分析出错。
根据各种结果显示,这次是在
LRESULT AFXAPI AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMsg,
WPARAM wParam = 0, LPARAM lParam = 0) 函数中出了问题,而弹出对话框的代码正是:
lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
应该说,这里微软没有处理得很好。对于Debug版本,可以弹出对话框,Release版本,就不应该弹出对话框了!
我把这句代码改成了下面的:
#ifdef _DEBUG
lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
#endif
2010.3.16
最终确认。
导致问题的代码确实是上面的代码。但是,我使用上面的修改方案,却无法解决问题!
最终解决方案:
最初是在Debug版本中发现的这一问题,使用上面的方法解决了。但是,Release版本中,问题依然存在。经过分析发现,这种方法对Release版本无效!
好在微软提供了CSocket等套接字类的源码,不包含系统库文件,而是把这些源码文件复制到自己的程序目录中,并包含到自己的工程中,稍作修改,编译通过。测试,OK!——这种方法对Debug也有效
- 1楼网友:洎扰庸人
- 2021-05-06 08:23