前回「Form1処理時にForm2の処理結果を考慮させるには?」でShowDialogを使用したのですが、Form2の処理からForm1処理に戻った後にCallでModule内のSubプロシージャを呼び出そうとしたのですが、「TypeInitializationException」はハンドルされませんでした(タイプ初期化子が例外をスローしました)となってしまいます。ShowDialogを使用するとなにか規制があるのでしょうか?ご教授願います。
クラス初期化子 (Shared Sub New())が例外を投げると,この例外にラップされた例外が発生します。
http://msdn.microsoft.com/ja-jp/library/system.typeinitializationexception.aspx
InnerExceptionを確認してください。
すみません、Module内でWordの作成処理を実施する為に
Public Word As New Word.Global とインスタンスを生成すると発生するみたいです。
Moduleというのは,インスタンスメンバが存在せず,かつインスタンス化不可能なClassです。
Moduleのメンバは,すべてShared修飾されたものとして扱われます。
# RefactorでC#に逆コンパイルしてみるとよくわかると思います。
で,SharedなフィールドでNewしているため,クラス初期化子が暗黙に存在し,そこで例外が発生したのでTypeInitializationExceptionが発生したのだと思います。
さて,追試してみました。
発生した例外のInnerExceptionプロパティから
System.Runtime.InteropServices.COMException
のオブジェクトが取得でき,メッセージが
CLSID {000209F0-0000-0000-C000-000000000046} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80040154。
とかだったりしませんか。
少し試してみたところだと,Wordのインスタンスが存在しない状況でGlobalオブジェクトを作成しようとすると,上記の例外が発生しました。
Applicationを先に作成して,その後でGlobalオブジェクトを作るようにしてみてはどうでしょうか。
ご指摘の通り、
>CLSID {000209F0-0000-0000-C000-000000000046} を含むコンポーネントの >COM クラス ファクトリを取得中に、次のエラーが発生しました: 80040154。
が発生していました。ワードオブジェクト作成後にGlobalオブジェクトを作成したところエラーを回避できました。自分はよくModuleを使用するのですが、出来る限り使用しないほうがよろしいのでしょうか。ご教授いただきありがとうございました。
ツイート | ![]() |