■51595 / inTopicNo.3) |
Re[2]: IMessageFilterのメソッド |
□投稿者/ ミキモト (2回)-(2010/07/10(Sat) 22:53:36)
|
■No51577 (Hongliang さん) に返信
> Application.AddMessageFilter で使用する System.Windows.Forms.IMessageFilter インターフェイスにはそんなメソッドはありません。
> COM のインターフェイス IMessageFilter にはありますけど、これは単にたまたま名前が同じというだけで、System.Windows.Forms.IMessageFilter とは関係ありません。
> で、後者が欲しいのでしょうか? COM メソッドの呼び出しに時間が掛かりすぎてダイアログが出るのをどうにかしたい、みたいな?
>
> その場合、このページが参考になるでしょう。
> http://msdn.microsoft.com/ja-jp/library/ms228772.aspx
> ここでは DTE の(時間が掛かる)メソッドを呼び出してますが。
ありがとうございます。
「System.Windows.Forms.IMessageFilter」 と「COM のインターフェイス IMessageFilter 」と混同してました。
やりたかったことは、
メインスレッドとは別のスレッドでExcel2002オブジェクトを生成してExcelファイルへ書き込み、上書き保存をしているのですが、
Excleから「メッセージフィルタはアプリケーションがビジーであることをしめしています。」の例外が発生するときがあるので、
そのときは、ビジーでなくなるまでリトライして、一通りのExcelの処理をすべて正常完了させたいのです。
で、
参考ページをみて、実行してみたのですが、
t = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.0", True)
を実行するところで「クラス文字列が無効です」の例外がでてしまいます。
参照ページの通り
COM 参照を "Microsoft Development Environment 8.0" に追加し、
ソリューションに EnvDTE と EnvDTE80 に対する参照が追加されてます。
VB.Net2008はCOM参照は"Microsoft Development Environment 9.0"かとおもい、
追加してソリューションに EnvDTE90 に対する参照も追加して。
t = System.Type.GetTypeFromProgID("VisualStudio.DTE.9.0", True)
としてみましたが、やはじ同じ例外が発生しました。
以下スレッドで実行しているコードです。
Public Sub TEST()
Dim dte As EnvDTE80.DTE2
Dim obj As Object = Nothing
Dim t As System.Type = Nothing
Dim MSGFilter As MessageFilter
t = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.0", True)
obj = System.Activator.CreateInstance(t)
dte = DirectCast(obj, EnvDTE80.DTE2)
MSGFilter = New MessageFilter
dte.MainWindow.Activate()
'ここでExcelオブジェクト生成して書込み、オブジェクト開放する
dte.Quit()
MSGFilter.Dispose()
End Sub
「クラス文字列が無効です」から先に進みません。
原因がわかる方、御教授ください。
|
|