永发信息网

请问这是什么意思?

答案:2  悬赏:70  手机版
解决时间 2021-05-06 22:40

现在开机时不时就冒出来,关了又 弹出来,什么意思啊?

最佳答案

出现该问题,一般都是因为使用了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也有效

全部回答
不如重装简单啊!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
电脑上怎么下载电视剧,怎样从网上下载电视剧
当你有礼貌的跟人说话,对方态度很差,你会/
面临就业实况而讲UG Pro/Engineer哪个更实用
成都地区 买手机那里能分期付款?
怎么把FLV格式转换成MP4支持的格式
推荐几首好听的DJ.要嗨的
钱钟书语句,举看淡名利的历史名人的例子
跪求2010皇马最新补丁
QQ自由幻想的黄金套装出了开会员礼包还有别的
C++那里有下?
森海蜂产品商店地址在哪,我要去那里办事
怎么装扮免费QQ空间,
天龙八部里八十四鞋子体.灵.定.力全加五十点
怎样减肥最安全
梦幻西游70—80升级方法?
推荐资讯
无法接收群消息
冬天来了,该怎样保暖?
天龙中高级打造图在那打怪出几率高?
QQ如何解除消费限制
高兴睡不着杂办?
为什么QQ空间进不去了。?
从武汉工程大学怎么到武汉工业学院怎么走
每天早起都会打N个喷嚏?为什么
哪些事情要说 哪些不要说
传世多少几张膀子
华硕M2400可以升级硬盘到160G吗?
月玲珑仙剑四云天河声优呆瓜小贼的个人网站
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?