FC2ブログ

クリップボード使用時のCOMException

あるWindows7のPCで、クリップボードに文字列を保存するSystem.Windows.Clipboard.SetText() を実行すると、ほぼ必ずSystem.Runtime.InteropServices.COMException が発生するということがあった。

調べてみると、クリップボードを監視するアプリが別に存在する場合、遅延レンダリングでコピーしたデータをすぐにレンダリングすることを要求され、この様な事態になるらしい。
(なぜすぐにレンダリング要求するとイカンのか、疑問が残る説明ではあるが、ここではそれは置いておく。)

遅延レンダリングとは、大きいデータなどをクリップボードにコピーした場合などを想定した機能で、その場でクリップボード側へのデータコピーを行わず、リンクをコピーする様な仕組みだ。
実際にペーストする時には、要求メッセージに応じてデータを提供する義務が、コピーを行ったアプリ側に発生する。

つまり、

1.System.Windows.Clipboard.SetText()は内部で必ず遅延レンダリングでコピーする。
2.クリップボード監視アプリがコピーを検出。
3.クリップボード監視アプリがデータの実体を要求。

という事がSystem.Runtime.InteropServices.COMException 発生の原因になっているらしい。

だが、実際のクリップボードの動作に影響はなく、コピーは完了している。
だから、下の様にSystem.Runtime.InteropServices.COMException をキャッチして何もしないコードを追加しておけば良いようだ。

    try
{
Clipboard.SetText(copyText);
}
catch (System.Runtime.InteropServices.COMException)
{ /* NOP */ }


因みに、いくつか調べた所、秀丸エディタでは、System.Runtime.InteropServices.COMException の発生時に「クリップボードのオープンに失敗しました。」とのメッセージボックスを表示しているみたいだ。Adobe Reader Xでも似た様な対応だ。

一方で、私の環境でクリップボード監視を行なっていたアプリのPDICでは、Ver 5.5.19で[Tools]-[設定]-[動作環境]に「クリップボードの不具合対策をする。」というチェックボックスができているのだが、この対策というのが、この問題に対するものなのかはよくわからない。もちろん試しはしたのだが、もともとSystem.Runtime.InteropServices.COMException は常に必ず発生する訳ではなく、再現の仕方が不明瞭なので、断定ができないのだ。

とにかく、人様のアプリの調査に時間割いても意味は無いので、System.Runtime.InteropServices.COMException は無視、と言うことで今のところ問題は起こっていない。

トラックバック


この記事にトラックバックする(FC2ブログユーザー)

[C#]Clipboardクラスでクリップボードを監視するとComExceptionが発生する

先日公開したぺたこーだというソフトで クリップボードにコピーされた文字列をリアルタイムで画面表示する処理を 入れていたんだけど、似たようなツールを作って仕事で使っていたら、 ときどきComExceptionをはいて落ちることがあった。 クリップボード監視処理は以下のような感じ。 var data = Clipboard.GetDataObject(); if (data.GetDataPre...

[C#]Clipboardクラスでクリップボードを監視するとComExceptionが発生する

先日公開したぺたこーだというソフトで クリップボードにコピーされた文字列をリアルタイムで画面表示する処理を 入れていたんだけど、似たようなツールを作って仕事で使っていたら、 ときどきComExceptionをはいて落ちることがあった。 クリップボード監視処理は以下のような感じ。 var data = Clipboard.GetDataObject(); if (data.GetDataPre...

コメントの投稿

非公開コメント

筆者について

SHEN13

Author:SHEN13
近年は、.NET+WPF+SQL Serverを使用した、上流からコーディングも行うPM業務を中心に手掛けています。

仕事のオファー歓迎します。
非公開コメントでどうぞ

アクセスカウンタ
最新記事
カテゴリ

openclose

リンク
検索フォーム
RSSリンクの表示