我编的一个程序 想用PostQuitMessage(0)来退出程序 
可是 同样的代码  我把它拷到不同的机器上执行时 发现PostQuitMessage(0)并
不能退出程序 而是继续执行后面的语句去了 
但在另一台机器上时 确发现能正常运行 不知道为什么 
 if(pLoginDlg->DoModal()==IDCANCEL)      //弹出登录对话框
{

         delete pClientSocket;
EndDialog(0);
     PostQuitMessage(0);
}   

    pClientSocket->Loginfo.m_SrvAd=pLoginDlg->m_SrvAd;//继续执行到这里,可是pCliectSocket已被杀了 所以出错   我在 PostQuitMessage(0)设断点,想跟踪进去看一看 可是进不去 但在别一台能正确执行的机器上确能跟进去 而且 不会执行下面的语句就退出程序了 
是不是我的环境设置有问题? 怎么改 另 编译时有时出现 
Loaded 'C:\WINNT\system32\wsock32.dll', no matching symbolic information found.这是什么原因? 

解决方案 »

  1.   

    PostQuitMessage(0);
    不会立即退出程序,而是程序发送(post)一个WM_QUIT消息,因此不会立即退出。也有可能消息循环截获WM_QUIT消息,过滤掉而不退出程序。PostQuitMessage后面的语句应该还可以执行到。
      

  2.   

    一般不这样直接调用PostQuitMessage吧,一般都是用SendMessage发送WM_CLOSE消息来中止。
    Loaded 'C:\WINNT\system32\wsock32.dll', no matching symbolic information found.
    表示你的Link选项Link了wsock32.lib(这是VC自动会Link一些Lib文件,不用管它),但你程序里实际上没有调用里面的函数,所以no matching symbolic information found.不用管它就好了。
      

  3.   

    可是 
    为什么有时候能够成功 正常运行 
    我保证  我没改过程序  
    我跟踪过  试过有些情况下 后面的语句即使执行到了 也还会产生影响 
    比如说  我明明删了pClientSocket  
    可是执行到 pClientSocket->Loginfo.m_SrvAd=pLoginDlg->m_SrvAd 及以后
    已被删的指针时都不会出错  而且执行到一半(还没完全执行完这个函数规定发需执行的语句)时就跳出去 
    当然  有时后 是不会执行到这个函数后而的语名的 直接就跳出去了 
    这当然是我所希望的见到的  程序正确执行了 
    如果 我的程序 在同一环境中 什么也没改 如果程序正解执行了 总是正确的如果是错误的 总是出现同样的错误 我不明白的  我根本查不出  正确执行的程序 与错误执行的程序 那里的代码不同了 我凡乎可以肯定 凡是我写的代码  都是一模一样的 但偏偏出现不同的情况 对这些问题 我真是很 头痛啊  
     
      

  4.   

    其实 解决这个应用上的问题并不难 
    只要在 PostQuitMessage(0);
    后 加 return 就行了 只是我不明白 为什么 我那样子  会出现那么奇怪的问题 那位 大侠 帮帮小弟
      

  5.   

    对不起 先前打错了一些字  
      可是   
    为什么有时候能够成功 正常运行   
    我保证  我没改过程序    
    我跟踪过  试过有些情况下 后面的语句即使执行到了 也不会产生影响   
    比如说  我明明删了pClientSocket    
    可是执行到 pClientSocket-  >Loginfo.m_SrvAd=pLoginDlg-  >m_SrvAd 及以后  
    已被删的指针时都不会出错  
    而且执行到一半(还没完全执行完这个函数规定需要执行的语句)时就跳出去   当然  有时后 是不会执行到这个函数后而的语名的 直接就跳出去了   
    这当然是我所希望的见到的  程序正确执行了   
    如果 我的程序 在同一环境中 什么也没改 如果程序正解执行了 总是正确的  
     
    如果是错误的 总是出现同样的错误   
     
    我不明白的  我根本查不出  正确执行的程序 与错误执行的程序 那里的代码不同了   
     
    我凡乎可以肯定 凡是我写的代码  都是一模一样的 但偏偏出现不同的情况   
     
    对这些问题 我真是很 头痛啊    
       
     
     
     
      

  6.   

    PostQuitMessage()是一个非阻塞型的函数,也就是说它不像SendMessage()那样,一直等到发出的消息执行完毕后才返回,而是把WM_QUIT消息放入队列中就返回了,这样的返回是很快的.PostQuitMessage()之后的语句是一定会被执行的.当你在PostQuitMessage()前删除了pClientSocket,与SOCKET相对应的那个隐藏的窗口并没有因此而被删除,仍在工作,于是出错.举例来说,在你的程序恰好运行到delete pClientSocket之前,与SOCKET相应的窗口收到一个消息,比如说RECEIVE,因为你已处在一个消息的处理函数内了,系统于是将此消息放入队列,这时你delete pClientSocket, PostQuitMessage(),在队列的尾部又加入WM_QUIT消息,你继续做此处理函数中的其他语句,然后结束此函数.消息循环把RECEIVE消息取出,调用你的处理函数,这时出错了,因为pClientSocket已无效. 这就是你的出错过程,即有一个其他消息出现在WM_QUIT前.而在另一台机器不出现的原因是在WM_QUIT前没有其他任何消息.这一点是你不能预先料定的,其实在同一台机器上若运行情况不同也可能会出同样的问题.
      

  7.   

    楼上的分析的有道理建意使用SendMessage发送WM_CLOSE消息
      

  8.   

    use WM_CLOSE to close and destroy windows to terminate. WM_QUIT just terminate message loop, in most time do nothing(no time to do) about resources collection. if u r lucky enough all resources collected in time, ur code can work correctlly, or it crashed otherwise.