在基于CDialog的MFC程序中,使用 HWND hwnd = SetClipboardViewer();
在debug模式中,没有任何问题,可以监视Clipboard的动作。但要编译成Release后,只要运行到SetClipboardViewer()就会死机,为什么?我的系统是win 2000 server +sp4  、vc6.0+sp4

解决方案 »

  1.   

    作 MFC 程序设计时,注意 ChangeClipboardChain() 的返回值,千万不要以为使用 TRUE / FALSE 就可以判断了,虽然这是标准的 MSDN ,但有错误!!!正确的方法是这样的:
    请在用了 ChangeClipboardChain() 之后立即调用 GetLastError() ,再用 SUCCEEDED() 宏来检验 ChangeClipboardChain() 返回值,从而判断是否成功。
      

  2.   

    在MSDN中响应WM_CHANGECBCHAIN  的函数OnChangeCbChain是这样定义的:
    afx_msg void OnChangeCbChain(
       HWND hWndRemove,
       HWND hWndAfter 
    );
    没有返回值的。
      

  3.   

    to sgnaw(李逍遥)
    我用你的方法试了一下,不是你所说的问题。
    如果在OnInitDialog()中使用SetClipboardViewer()会马上出错,如果是用一个按钮来运行SetClipboardViewer()时,只要不让对话框失去焦点不会出错,只要失去焦点时才会出错
      

  4.   

    哦,我的眼睛是不是看花了啊,你用的( OnChangeCbChain ) 和我说的 ( ChangeClipboardChain ) 不是一个函数了,没有返回值不太好吧。另外,谢谢你的分,不知道你是如何做的,但我提供一点相关信息也许可以有所帮助。一般查看 Clipboard 内容关键三个 API :
    1.GetClipboardViewer()  返回 chain 中第一个窗口( window )的句柄( handle )
    2.SetClipboardViewer()  向 chain 首部添加一个 window 并且返回一个 handle 给下一个 viewer
    3.ChangeClipboardChain() 从 chain 中删除一个 window.另外,当调用 SetClipboardViewer() 时要小心,你必须保存它返回的 handle 并使用这个 handle 在适当的时候来传递任何 WM_DRAWCLIPBOARD 或者 WM_CHANGECBCHAIN 消息,
    同样的,在用了 SetClipboardViewer() 之后,应使用 GetLastError() 来返回一个 DWORD,再用 SUCCEEDED() 宏来测试这个返回值。