C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: WORDのプロセス解放について


(過去ログ 38 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■19714 / inTopicNo.1)  WORDのプロセス解放について
  
□投稿者/ 純@WAS (4回)-(2008/05/28(Wed) 11:49:49)

分類:[ASP.NET (C#)] 

2008/05/28(Wed) 11:58:11 編集(投稿者)
お世話になっております。

ASP.NETからWordの出力を行っているのですが、
2回目以降に投稿ボタンをクリックすると
「COMException
このファイルは読み取り専用です。」
というエラーが発生します。

タスクマネージャからプロセスを参照したところ、WINWORD.EXEが終了されていませんでした。
しかしこれは100%発生するわけではなく、なぜ場合によってWINWORD.EXEが終了されないのかが解りません。

以下のコードが投稿ボタンとなります。
不足があればご指摘下さい。

-----
        protected void Button1_Click(object sender, EventArgs e)
        {
            #region ワードファイルの定義を行う
            //ファイル名
            object fileName = "C://test.doc";
            //読み取り専用
            object readOnly = false;
            //活性
            object isVisible = true;
            //MissingValue
            object missing = System.Reflection.Missing.Value;

            //ワードのインスタンスを作成
            ApplicationClass oWordApp = new ApplicationClass();

            //ドキュメントのインスタンスを作成
            Document oWordDoc = oWordApp.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing,
                                                        ref missing, ref missing, ref missing, ref missing, ref missing,
                                                        ref missing, ref missing, ref missing, ref missing, ref missing,
                                                        ref missing, ref missing);
            #endregion

            oWordApp.Selection.TypeText(txtA.Text);
            oWordApp.Selection.TypeParagraph();
            oWordApp.Selection.TypeParagraph();
            oWordApp.Selection.TypeText(TxtB.Text);

            oWordDoc.Save();

            System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordDoc);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordApp);
        }
------

なお、環境は
Windows XP
VisualStudio 2005 C#
です

引用返信 編集キー/
■19717 / inTopicNo.2)  Re[1]: WORDのプロセス解放について
□投稿者/ 鶏唐揚 (169回)-(2008/05/28(Wed) 12:09:24)
No19714 (純@WAS さん) に返信
> oWordDoc.Save();
>
> System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordDoc);
> System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordApp);
ワードのインスタンスを作る=WORDのプロセスが起動する
なので、明示的にWORDを終了させないままオブジェクト解放しちゃってるので、
ガベージコレクトによってプロセス自体が終了されるタイミングが不定になってるのではないでしょうか。

#そもそもガベコレでプロセスが終了されるかどうか私は知らない…

ので、解放前に終了させてやればいいのではないでしょうか。

ワードのプロセスは扱ったことないので
oWordDoc.Closeなのか.Quitなのかわかりません。

引用返信 編集キー/
■19718 / inTopicNo.3)  Re[1]: WORDのプロセス解放について
□投稿者/ やじゅ (421回)-(2008/05/28(Wed) 12:12:48)
No19714 (純@WAS さん) に返信
> タスクマネージャからプロセスを参照したところ、WINWORD.EXEが終了されていませんでした。
> しかしこれは100%発生するわけではなく、なぜ場合によってWINWORD.EXEが終了されないのかが解りません。
>
> System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordDoc);
> System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordApp);


WORDではなくEXCELではあるけれど、ここらあたりかしらん。

System.Runtime.InteropServices.Marshal.ReleaseComObjectメソッドを
参照カウントが0(ゼロ)に到達するまで、複数回呼び出す

VB.NETでEXCELのプロセスを確実に終了させる方法
http://bbs.wankuma.com/index.cgi?mode=al2&namber=14632&KLOG=30
http://d.hatena.ne.jp/zecl/searchdiary?word=%A5%D0%A5%A4%A5%F3%A5%C7%A5%A3%A5%F3%A5%B0
引用返信 編集キー/
■19719 / inTopicNo.4)  Re[2]: WORDのプロセス解放について
□投稿者/ 純@WAS (5回)-(2008/05/28(Wed) 12:56:02)
ご指摘いただきありがとうございます。

鶏唐揚のご指摘通り、明示的にワードを閉じていない事が原因でした。

オブジェクト解放前に、
oWordApp.Quit(ref missing , ref missing , ref missing);
を挿入することで、解決しました。

また、やじゅ様に掲載して頂いたサイトを参考に
プロセスを確実に停止したところ、現象は解決されました。

初歩的なミスを見落としによりお手数をおかけいたしました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -