1

理想的には、リーダーはネイティブC++プログラムをOpenClipboard()ブロックを含むVisualStudio2008にアップグレードしました。OpenClipboard()から正常なリターンコードを取得した直後にブレークポイントを設定して、コードをステップ実行してみませんか。インターネットによると、それはあなたのシステムで動作するかもしれませんが、もちろん、私のものではなく、試してくれてありがとう。

たとえば((OpenClipboard 1418 vc6))をグーグルで検索すると、「GetClipboardDataはデバッガーで失敗します」や「VC ++ 6ではエラーは発生しませんが、VC++2005ではエラーが発生します」などの記事が見つかります。実用的には、問題は解決しました-そのようなコード内にブレークポイントを設定することはできません。クリップボードの操作が完了した後、情報をリスしてブレークポイントを設定する必要があります。エラー1418は「スレッドでクリップボードが開いていません」ですが、VS.NETを使用しない限り、またはクリップボード-オープン-クローズ-ブロックの外側にブレークポイントを保持する場合は、正常に機能します。

VS.NETデバッガーの正確な問題が何であるかを知ったほうがよいと思います。

C ++の人間である私は、dot-Netを実行するときに、スレッドの観点から考える必要がないことをぼんやりと認識しています。とにかく、実際に問題が、ネイティブC ++コードをシングルステップで実行したときに、dot-Netデバッガーがスレッド情報に微妙に干渉していることであるかどうかにかかわらず、実際に何が起こっているのかについての第一人者品質の説明は見つかりませんでした。

システムに関して:XP-proによると、約1年前、2つのデュアルコアXeon、4つのCPU。XP-SP2-32ビットのvc6でシングルステップでコードをデバッグし終えたところです。だから私はコードがvc6の下でかなりうまくいったことを知っています。ただし、10メガバイトのCF_TEXTでテストしたところ、例外が発生しました。XP-x64のより良い例外モデルの下でデバッグを試してみようと思いました。

visual-studio-2008で再コンパイルしたところ、コードをシングルステップにすることができませんでした。OpenClipboardは機能しましたが、EnumClipboardFormats()は機能せず、シングルステップでは何も機能しませんでした。ただし、コードの完全なブロックの下にブレークポイントを設定すると、すべてが正常に機能しました。そして、はいvc2008は、szBufの周りのピンポイント診断のスタックフレームの破損を引き起こしました。vc2008については好きなことがたくさんあります。これがどういうわけか単なるクリップボードの問題であるとしたら、スレッドコンテキストの問題がdot-Net-debuggerに起因するかどうかにかかわらず、何かをステップスルーすることを心配せざるを得ないと感じることなく、それは素晴らしいことです。

4

2 に答える 2

1

私はこれを調べたことはありませんが、推測するのは簡単です:

  1. クリップボードは共有リソースです
  2. 特定の時点でクリップボードを「所有」できるのは、(デスクトップごとに) 1 つのアプリのみです。
  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 に答える