1

理想情况下,读者已将本机 C++ 程序升级到 Visual Studio 2008,其中包含一个 OpenClipboard() 块。为什么不尝试在从 OpenClipboard() 获得成功的返回码并单步执行代码之后设置断点。根据互联网,它可能适用于您的系统,但当然,不适用于我的系统,感谢您的尝试。

谷歌搜索例如 (( OpenClipboard 1418 vc6 )) 会发现诸如“GetClipboardData 在调试器中失败”和“在 VC++6 中没有错误但在 VC++2005 中出错”之类的文章。目前实用,问题已解决 - 我根本无法在此类代码中设置断点,我需要存储信息并在剪贴板操作完成后设置断点。错误 1418 是“线程没有打开剪贴板”,但只要您不使用 VS.NET,它就可以正常工作,或者就像我说的,如果您将断点保留在剪贴板打开关闭块之外。

知道 VS.NET 调试器的确切问题是什么,我会感觉更好。

作为一个 C++ 人,我只是模糊地意识到在做 dot-Net 时你不应该考虑线程。无论如何,当您单步通过本机 C++ 代码时,我没有找到真正发生的事情的大师级解释,事实上问题是否在于 dot-Net 调试器以某种方式巧妙地干扰了线程信息。

系统方面:大约一年前,两个双核 Xeon,根据 XP-pro 的 4 个 CPU。我刚刚通过在 XP-SP2-32 位下的 vc6 中单步调试代码。所以我知道代码在 vc6 下非常好。但是,当我使用 10 兆字节的 CF_TEXT 进行测试时,我遇到了异常。我想尝试在 XP-x64 更好的异常模型下调试。

用visual-studio-2008重新编译,我根本无法让代码单步运行。OpenClipboard 工作,但 EnumClipboardFormats() 没有工作,单步时没有任何工作。但是,当我在完整的代码块下方设置断点时,一切正常。YES vc2008 对 szBuf 周围的堆栈帧损坏进行了精确诊断。vc2008 有很多值得喜欢的地方。如果这只是一个剪贴板问题,那就太好了 - 不知道我会被迫担心通过任何事情,线程上下文问题是否可能是由于 dot-Net-debugger。

4

2 回答 2

1

我从来没有调查过这个,但很容易猜到:

  1. 剪贴板是共享资源
  2. 在任何给定时间点,只有一个应用程序(每个桌面)可以“拥有”剪贴板
  3. 您的应用拥有它(调用后OpenClipboard()
  4. VS 想要它(可能是因为它是一个编辑器)
  5. 当您的应用程序在断点处停止时,再多的等待也不会找到不属于您的应用程序的剪贴板。
  6. 欢闹接踵而至!
于 2008-09-17T04:49:39.707 回答
1

不要浪费时间怀疑这是一个 .NET 的东西。有时,Visual Studio.NET 和 .NET 运行时之间的关系就像 ActiveX 和 ActiveDirectory - 它告诉您涉及到哪个营销商,Visual Studio.NET 实际上有许多调试器。本机、脚本或托管 - 只有后者真正与 .NET 相关。您将使用本机调试器。

如果您想进行调查,我建议使用 Microsoft Detours 挂钩 OpenClipboard,然后在调试器中运行您的应用程序。您将能够看到谁在争夺剪贴板。

于 2008-10-02T11:41:56.450 回答