小弟弄了一个在线打牌的软件,为适合潮流在里同加入了一个 了天 的功能,用于在打牌(或是看牌)的同时支持了天。由于牌的显示之类的操作会影响到另一个 了天 窗户口的消息的正常工作,因此如果出牌的时候(从网络传来的数据)正巧自己在了天窗户口输入,这时输入就会变得没有响应,要等牌出完后才恢复正常。为了避免这种情况我另外弄了一个界面线程,把了天窗户口放在里面这样让他有一个单独的消息循环。 了天窗户口里面的OUTPUT部分为了适合潮流选用具有”格式化“功能的RICHEDIT控件
现在用的是RICHED2。 现在问题出来了,在2000下运行正常,可在98下程序退出的时候大多数情况下就会死机(蓝屏的那种),后来我偿试将RICHEDITCTRL去掉,则程序运行正常。我也偿试不用界面线程,程序也运行正常。因此我初步分析是由于RICHEDCTRL以及线程造成,但又不可能不用,所以想请各位有经验的大侠给讲讲在这种情况下该怎么样正确处理,另外我今天听一个朋友说在98下如果可能尽量不要用RICHEDCTRL,说很多时候会出兼容性问题。想听各位的意见,在线守候
QQ:57226475谢谢谢谢

解决方案 »

  1.   

    补充一下:1。所说的异常只是偶尔会在98上了现,不是每次都有
    2。基于商业的考虑,在程序顶部有一个HEADBAR(自CTOOLBAR),最左边包含有一个
    WEBBROSER(该代码是利用VC工具自动产生的)。该控件依赖于shdocvw.dll
    而在程序异常前堆栈就是显示的
    shdocvw! xxxxx:xxxxxx , 当我把该控件从HEADBAR中去掉时,程序又运行正常另外:通过DEBUG发现程序没有明显的内存泄漏现象,有的只是两个我无法控制的
    底层C的代码。好象越来越奇怪了,请人支持
    相关截图:
    http://www.softdeveloper.net/uploads/pic/error/debug_screen/index2.htm
      

  2.   

    找到问题了,已经确定是CWebBroswer产生的,之前我没有重载ONDESTROY方法
    后来加了一个,在我DEBUG到HEADBAR上的ONDESTROY里面

    void CHeadBar::OnDestroy()
    {
       m_Broswer.Stop(); //此句出现异常 access voilation(c0000005)
       m_Broswer.Quit();   CToolbar::OnDestroy();
    }怎么解决,哪位给个意见!
      

  3.   

    这绝对是个兼容性的问题,
    我决定用TRY语句强行略掉!!!不过不知道会不产生其它问题唉,郁闷
      

  4.   

    我在headbar的ondetroy里
    try
    {
      m_Browser.stop
      m_Browser.quit();
      
      Ctoolbar::ondestroy();
    }
    catch(...)
    {
       TRACE("DDD"); 
    }虽然在这里是把这个异常糊弄过去了,可后来那异常又跑出来了,
    //=================================================
    你说当那异常出现的时候为什么看不到异常堆栈呢
    红黑箭条衫 00:24:27
    有点儿像是另一个线程在执行什么东西而引起的,而不是当前调用引起的,对不对
    chunlin 09:28:35

    红黑箭条衫 00:25:03
    用SPY鸡窝到那个WEBBROSWER开了几个线程
    红黑箭条衫 00:25:14
    有没有可能就是那里面搞的鬼
    chunlin 09:29:22
    有可能
    请高手现身
      

  5.   

    你可以试试这样做:
    在工程属性对话框的C/C++ 标签页里,选择“Code Generation”分类,把“Use run-time library”下拉列表中随便选一个Multithreaded,再编译一下
    [偶在某处已经回答过一遍完全一样的问题啦,哈哈]
      

  6.   

    问题解决了吗?如果解决了,能不能把你的问题整理一下,放到我的网站上去!或者你把主要思路告诉我,我来整理!谢谢!
    ===================================================
    Digit Pro space  欢迎您
    http://www.dpspace.com
    有什么问题到论坛上发表,我将尽我全力为您解决
    论坛欢迎高手注册加入,让我们共同进步
      

  7.   

    你可以试试这样做:
    在工程属性对话框的C/C++ 标签页里,选择“Code Generation”分类,把“Use run-time library”下拉列表中随便选一个Multithreaded,再编译一下
    [偶在某处已经回答过一遍完全一样的问题啦,哈哈]
    =================
    我现在的设置是 debug multithread
    在RELESET版本下是 multithread请大虾继续指导,我请你吃饭!
      

  8.   

    to oiq(oiq):
    等我把这问题测底解决了,我会整理好后放到你那去的,谢谢你的关注
      

  9.   

    反正单线程本来就是可以的嘛,纳闷中...可以把代码给俺见识见识么
    [email protected]
      

  10.   

    另外我用BC DEBUG时还有一个值得注意的现象HEADBAR是继承自TOOLBAR,最左边是WEBBROSWER控件(他的ID是0x32771),右边是几个按钮。用BC调试报参数错参看
    http://expert.csdn.net/Expert/TopicView1.asp?id=1839588
    调用时的堆栈图:http://www.softdeveloper.net/uploads/pic/error/2.jpg
    请大虾继续帮我分析,请吃饭!
      

  11.   

    看了那个截屏图,偶觉得这个提示没有多大的意义,只能说0x03c875d0 的CHeadBar 的对象是不合法的,但是其它地方的不恰当的内存操作也会导致其状态错误,产生这样的结果总得定位到具体是哪个函数出问题才行,可以说一下RichEdit是怎么使用的么?
    你有做了什么操作后出事的,是创建后、显示、收发消息、或者调什么函数后
    RichEdit的环境比如是在SDI中么,有什么保存Dock 之类的调用么
      

  12.   

    RICHEDIT只是用于显示带格式的了天信息,不作任何其它用途具体到哪个函数? 好象在RICHED上的操作没发现错误,只在M_BROWSER上的STOP()和QUIT()操作上出的异常 CWEBBROWSWER是利用VC的工具生成的,调用的COM之类的,不是由我所能控制的RICHEDIT的是放在一个模式无DIALOG里面的启动程序后任何事情都不做,也不在RICHEDIT上显示任何东西均会出异常
      

  13.   

    无论是stop 还是quit,偶都是觉得对找错都没多大的意义(个人观点)
    建议:
    1.把几个相关的类WEBBROSWER/HEADBAR/RICHEDIT 提出来放到新建的工程里,看看会不会出错,如果也出错的话把这个工程给偶2.如果你可以接受“只改变字的颜色”建议你把RichEdit换掉(这样该应该是最快),以下页面有两个可改变颜色的控件Crystal 和Colorizing
    http://www.codeproject.com/editctrl/
      

  14.   

    谢谢光荣! 我也认为弄清stop和quit 对改正错误没有太直接的帮助,但通过偿试这两个方法 通过try,我找到错误的根源,就是这个WEBBROWSER控件的DESTROY(大致是这个意思)方法失败所引起的。 最初我偿试通过TRY语句把这个异常滤掉,后来的事实表明我这是一厢情愿,即使在那儿滤掉了在之后的又会出现更奇怪的错误,我想可能还有其它的原因,比如说WEBBROWSER的爸爸窗户口HEADBAR的创建是不是有也有问题。后来我仔细检查我的代码,发现了一个线索我的HEADBAR的里CREATE方法有这一段代码b = CreateEx(pParent,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);再仔细看看MSDN,我觉得这里的“  ID  ”似乎有些问题我改成
    b = CreateEx(pParent,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_FLYBY|CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),id);然后在98重新编译测试,发现最初用BC查出的的那个 “错误参数” 不见了! 我心一喜
    之后测试退出12次,均没有发生异常现象,因此我现在估认为这个BUG已经解决了,BUG的原因是爸爸窗户口采用的创建方法不正确(但是创建成功了)而造成了,现在已经提交用户测试了正等待好消息 ^_^不过还有一个奇怪的问题(以前也存在,机率很小),就是把MOUSE MOVE到TOOLBAR的左边的BUTTON上时会出奇怪的堆栈
    http://www.softdeveloper.net/uploads/pic/error/debug_screen/
    后来我用TRY语句把他给滤掉了,就OK了,不过心里还是不踏实唉,一个星期没怎么睡觉,BUG解除了好象更睡不着了,程序员真苦!
      

  15.   

    那个Control ID可以用SPY++的“窗体属性”来观察
    你把原来出事的那个和可用的两个程序都拿来,在98下面看一下它们的Control ID,如果不一样的话,这个问题就不必再去理会了
    没什么好建议,继续用TRY吧
      

  16.   

    那个Control ID可以用SPY++的“窗体属性”来观察
    你把原来出事的那个和可用的两个程序都拿来,在98下面看一下它们的Control ID,如果不一样的话,这个问题就不必再去理会了
    ==================
    嗯,肯定是不一样的,我查过了