为什么我不能在VS.NET调试器中单步执行剪贴板代码?

时间:2008-09-17 04:28:46

标签: c++ visual-studio winapi debugging clipboard

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

Google搜索((OpenClipboard 1418 vc6))找到类似“GetClipboardData在调试器中失败”和“VC ++ 6中没有错误但在VC ++ 2005中出错”的文章。实际上是一时的,问题解决了 - 我根本无法在这样的代码中设置断点,我需要在剪贴板操作完成后松鼠信息并设置断点。错误1418是“线程没有打开剪贴板”,但只要你不使用VS.NET就可以正常工作,或者就像我说如果你在剪贴板 - open-close-block之外保留断点一样。

我想知道VS.NET调试器的确切问题是什么。

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

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

使用visual-studio-2008重新编译,我根本无法获得单步执行的代码。 OpenClipboard工作,但EnumClipboardFormats()没有工作,单步时没有任何工作。但是,当我将断点设置在完整的代码块之下时,一切正常。并且 vc2008在szBuf周围进行了精确诊断'堆栈帧损坏。 vc2008有很多值得关注的地方。如果这只是一个剪贴板问题会很好 - 不知道我会感到有必要担心通过任何方式踩到线程上下文问题可能是由于dot-Net-debugger。

2 个答案:

答案 0 :(得分:1)

我从未研究过这个问题,但很容易猜到:

  1. The clipboard is a shared resource
  2. 在任何给定的时间点,只有一个应用程序(每个桌面)可以“拥有”剪贴板
  3. 您的应用拥有它(致电OpenClipboard()后)
  4. VS想要它(可能是因为,除其他外,它是一个编辑)
  5. 当您的应用程序在断点处停止时,任何等待时间都不会发现剪贴板不属于您的应用程序。
  6. 欢闹随之而来!

答案 1 :(得分:1)

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

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

相关问题