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

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

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

Re[19]: COMオブジェクトで起動したExcelの印刷を行うと例外発生


(過去ログ 176 を表示中)

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

■100893 / inTopicNo.1)  COMオブジェクトで起動したExcelの印刷を行うと例外発生
  
□投稿者/ ジェイド (11回)-(2022/11/17(Thu) 14:40:06)

分類:[VB.NET/VB2005 以降] 

VisualStudio2019で開発しております。

以下のようなコードで、Excelを起動して終了するまで待っている処理を組んでおります。
----------------------------------------------------------------------------------------------
        Dim excelApp As New Excel.Application()
        Dim excelBook As Excel.Workbook

        'Excelを表示
        excelApp.Visible = True
        'Excelを開く
        excelBook = excelApp.Workbooks.Open("※ファイルのパス")

        '終了するまで繰り返す
        Do

            System.Threading.Thread.Sleep(250)

        Loop While excelApp.Visible = True

        '作成したCOMオブジェクトの開放
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelBook)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
----------------------------------------------------------------------------------------------

この処理で、起動したExcelから印刷を行うと、
「呼び出し先が呼び出しを拒否しました。
 (HRESULT からの例外:0x80010001 (RPC_E_CALL_REJECTED))」
という例外メッセージが必ず出ます。

なお、印刷自体は行われるようです。

原因、対策をご存じの方はおられますでしょうか。
宜しくお願い致します。

引用返信 編集キー/
■100895 / inTopicNo.2)  Re[1]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ KOZ (355回)-(2022/11/18(Fri) 13:33:07)
No100893 (ジェイド さん) に返信
> 以下のようなコードで、Excelを起動して終了するまで待っている処理を組んでおります。

こんな感じでどうでしょう?

Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, _
                        ByRef lpdwProcessId As Integer) As Integer
    End Function


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim app As New Excel.Application
        Dim books As Excel.Workbooks = app.Workbooks
        Dim book As Excel.Workbook = books.Open("E:\TEST\test.xlsx")
        app.Visible = True

        Dim hwnd As IntPtr = New IntPtr(app.Hwnd)
        Dim pid As Integer
        Dim threadId As Integer = GetWindowThreadProcessId(hwnd, pid)
        Marshal.ReleaseComObject(book)
        Marshal.ReleaseComObject(books)
        Marshal.ReleaseComObject(app)

        Using p = Process.GetProcessById(pid)
            p.WaitForExit()
        End Using
        MessageBox.Show("EXCEL 終了!")
    End Sub

End Class


引用返信 編集キー/
■100896 / inTopicNo.3)  Re[1]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ kiku (308回)-(2022/11/18(Fri) 16:11:54)
No100893 (ジェイド さん) に返信

COMオブジェクトまったく使わなくなりますが
こちらではダメなのかなー。
※KOZさんの回答見て思いつきました。

        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("開始");
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = @"C:\test.xlsx";
            p.Start();
            p.WaitForExit();
            Console.WriteLine("終了");
        }

引用返信 編集キー/
■100897 / inTopicNo.4)  Re[2]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ kiku (309回)-(2022/11/18(Fri) 16:17:01)
No100896 (kiku さん) に返信
> ■No100893 (ジェイド さん) に返信
>
> COMオブジェクトまったく使わなくなりますが
> こちらではダメなのかなー。
> ※KOZさんの回答見て思いつきました。

たぶん、COMオブジェクトにて、印刷開始とかの処理があるのかな。
却下で(笑

引用返信 編集キー/
■100898 / inTopicNo.5)  Re[3]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (12回)-(2022/11/18(Fri) 19:55:15)
KOZさん
kikuさん

すみません、遅くなりました。
今、検証中なのですがKOZさんの改修案で大丈夫そうに見えます!
もう少しテストを進めてみます。
ありがとうございました。

単純にプロセス起動にしていないのは
BOOKの共有をしている時に、Excelが起動直後、一旦落ちて新しいプロセスIDで起動し直すので
プロセスIDが取得出来ないという問題があり、COMオブジェクト起動に切り替えたという
経緯がありました。
引用返信 編集キー/
■100899 / inTopicNo.6)  Re[4]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (13回)-(2022/11/18(Fri) 20:12:13)
ありがとうございます!
大丈夫そうです。
助かりました!
解決済み
引用返信 編集キー/
■101057 / inTopicNo.7)  Re[5]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (14回)-(2022/12/22(Thu) 16:05:57)
すみません、解決していたのですが最近、イベントビューアのApplicationログを
確認していると以下のエラーが出ていることに気付きました。

障害が発生しているアプリケーション名: PrintExcel.exe、バージョン: 1.0.0.3、タイム スタンプ: 0x638fdf43
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 10.0.19041.2364、タイム スタンプ: 0x5b7d4d22

なぜ出るのかが分からないのですが、出さないようにすることは出来るのでしょうか・・・
引用返信 編集キー/
■101061 / inTopicNo.8)  Re[6]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ KOZ (377回)-(2022/12/22(Thu) 20:46:05)
No101057 (ジェイド さん) に返信
> 障害が発生しているアプリケーション名: PrintExcel.exe、バージョン: 1.0.0.3、タイム スタンプ: 0x638fdf43
> 障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 10.0.19041.2364、タイム スタンプ: 0x5b7d4d22
> なぜ出るのかが分からないのですが、出さないようにすることは出来るのでしょうか・・・

支障なく使えているなら無視してもいいような・・・
毎回出てるんでしょうか?
引用返信 編集キー/
■101065 / inTopicNo.9)  Re[7]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (15回)-(2022/12/23(Fri) 09:00:04)
KOZ さん

> 支障なく使えているなら無視してもいいような・・・
> 毎回出てるんでしょうか?

おはようございます、はい、挙動としては問題ないのですが
毎回上がってきております。
何が原因なのかさっぱりわからずで・・・
解決出来ない場合は、そう報告するしかないかなと思っています。
引用返信 編集キー/
■101067 / inTopicNo.10)  Re[8]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ KOZ (379回)-(2022/12/23(Fri) 21:03:25)
No101065 (ジェイド さん) に返信
> おはようございます、はい、挙動としては問題ないのですが
> 毎回上がってきております。
> 何が原因なのかさっぱりわからずで・・・
> 解決出来ない場合は、そう報告するしかないかなと思っています。

何をやったときに出力される、というのは特定できていますか?
たとえば、PrintExcel.exe のこのコードを通ったときに出力される、とか
Excel をこう操作したら出力される、等

引用返信 編集キー/
■101070 / inTopicNo.11)  Re[9]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (17回)-(2022/12/26(Mon) 10:09:17)
No101067 (KOZ さん) に返信
> 何をやったときに出力される、というのは特定できていますか?
> たとえば、PrintExcel.exe のこのコードを通ったときに出力される、とか
> Excel をこう操作したら出力される、等

すみません、遅くなりました。
現在確認出来ているのは、exeが終了するタイミングで表示されているようです。

KOZさんにいただいたコード内では発生している状況ではないようで現在調査中です。
何か分かりましたらまたご報告させてください。
引用返信 編集キー/
■101071 / inTopicNo.12)  Re[10]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (19回)-(2022/12/26(Mon) 13:35:50)
すみません、.NET Runtime イベントID:1026 で以下のエラーメッセージも出ているのです
これはフレームワークの問題でしょうか。
ただ、プロジェクトで指定しているフレームワークは、4.72 なんですが・・・


アプリケーション:PrintExcel.exe
フレームワークのバージョン:v4.0.30319
説明: ハンドルされない例外のため、プロセスが中止されました。
例外情報:System.ObjectDisposedException
場所 System.Windows.Forms.Control.CreateHandle()
場所 System.Windows.Forms.Form.CreateHandle()
場所 System.Windows.Forms.Control.get_Handle()
場所 System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
場所 System.Windows.Forms.Form.SetVisibleCore(Boolean)
場所 System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext)
場所 System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(System.String[])
場所 PrintExcel.My.MyApplication.Main(System.String[])

引用返信 編集キー/
■101079 / inTopicNo.13)  Re[11]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ 伝説のカレー (58回)-(2022/12/27(Tue) 17:57:22)
No101071 (ジェイド さん) に返信

破棄されたオブジェクトを使おうとして発生する例外っぽいので
オブジェクトの破棄を処理の最後の方でやるといんじゃないかなって思いました
引用返信 編集キー/
■101080 / inTopicNo.14)  Re[11]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ 魔界の仮面弁士 (3518回)-(2022/12/27(Tue) 18:48:33)
No101071 (ジェイド さん) に返信
> ただ、プロジェクトで指定しているフレームワークは、4.72 なんですが・・・

未確認ですが、こんな感じの対応だったような。

v1.0.3705 → .NET Framework 1.0
v1.1.4322 → .NET Framework 1.1
v2.0.50727 → .NET Framework 2.0/3.0/3.5
v4.0.30319 → .NET Framework 4/4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2/4.7/4.7.1/4.7.2/4.8/4.8.1


> Excelを起動して終了するまで待っている処理を組んでおります。
具体的には、どのように待機させていますか?
待機処理をどこでどのように行っているのかが知りたいです。

No100895 の KOZ さん案そのままなのか。
あるいは待機中、Form を表示しないような実装になっているのか。
引用返信 編集キー/
■101082 / inTopicNo.15)  Re[11]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ KOZ (381回)-(2022/12/27(Tue) 21:02:19)
No101071 (ジェイド さん) に返信

こんなことやってませんか?

Public Sub New()
    InitializeComponent()
    If 条件 Then
        Me.Close()
    End If
End Sub

引用返信 編集キー/
■101083 / inTopicNo.16)  Re[12]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (20回)-(2022/12/31(Sat) 23:17:52)
すみません、随分と遅くなりました。

> 伝説のカレーさん

実際のモジュールでは、他の関数等が後続に控えており、COMオブジェクトの解放の移動をするのは難しく感じております・・・
アドバイスいただき申し訳ございません。

> 魔界の仮面弁士さん

はい、No100895 の KOZ さん案、ほぼそのままの内容で関数を作成しています。
また、メインフォームは非表示です。
これが影響していたりするのでしょうか?

> KOZさん

すみません、現在、ソースの確認が出来ないです。
年明けに確認してみます。

大変申し訳ございませんがまたご報告させてください。
宜しくお願い致します。
引用返信 編集キー/
■101084 / inTopicNo.17)  Re[12]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (21回)-(2023/01/04(Wed) 10:44:55)
No101082 (KOZ さん) に返信
> ■No101071 (ジェイド さん) に返信
>
> こんなことやってませんか?
>
> Public Sub New()
> InitializeComponent()
> If 条件 Then
> Me.Close()
> End If
> End Sub
>

すいません、遅くなりました。
Designer.vbファイルではInitializeComponentが存在していましたが呼び出しはしていないようでした。
取り急ぎご報告です。
引用返信 編集キー/
■101085 / inTopicNo.18)  Re[13]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (23回)-(2023/01/04(Wed) 13:11:49)
2023/01/04(Wed) 13:13:17 編集(投稿者)
2023/01/04(Wed) 13:13:05 編集(投稿者)

<pre><pre>追加情報です。
Designer.vbファイルの方で、下記のようなコードが確認出来ました。
これが影響している可能性が考えられますでしょうか。

    'Windows フォーム デザイナで必要です。
    Private components As System.ComponentModel.IContainer

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub
</pre></pre>

引用返信 編集キー/
■101086 / inTopicNo.19)  Re[14]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ 魔界の仮面弁士 (3519回)-(2023/01/04(Wed) 20:44:18)
No101085 (ジェイド さん) に返信
> これが影響している可能性が考えられますでしょうか。

Overrides Sub Dispose(Boolean) は自動生成されるコードですよね?

Form に「コンポーネント」(Timer や BackgroundWorker 等)を貼っている場合は、そのコードが必要です。
「コントロール」(TextBox や ListBox 等)だけしか貼っていない場合は、Dispose のオーバーライドを
行わなくても問題無いですが、わざわざ自動生成コードを削る意味は無いでしょう。


…で、気になるのはそのメインフォームの役割。

非表示のままにしている、という点は別に構いませんが、InitializeComponent すら
呼んでいないということは、デザイナコードは未使用のはずですし、そうすると
待機処理をどこに書いているのだろう、という不安がありました。

先のエラーメッセージで、CreateHandle 中の ObjectDisposedException 例外が見えているので、
「待機処理を Sub New で行っているのではあるまいか…」という疑念です。
要するに、何らかのロード処理(OnLoad メソッドのオーバーライド、または Load イベントの処理)が
終わっていない状況で Form が破棄されていて、それがエラーの原因になったのではないか、と。
引用返信 編集キー/
■101088 / inTopicNo.20)  Re[15]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
 
□投稿者/ ジェイド (24回)-(2023/01/05(Thu) 16:30:34)
No101086 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん、ご連絡ありがとうございます。

> Overrides Sub Dispose(Boolean) は自動生成されるコードですよね? 

すみません、大変失礼致しました。他のフォームにも同じように入っておりました。
 
> Form に「コンポーネント」(Timer や BackgroundWorker 等)を貼っている場合は、そのコードが必要です。
> 「コントロール」(TextBox や ListBox 等)だけしか貼っていない場合は、Dispose のオーバーライドを
> 行わなくても問題無いですが、わざわざ自動生成コードを削る意味は無いでしょう。

フォームに貼ってあるのは、Label と Timer のようです。

フォームのLoad処理で、以下のようにしておりました。
        AddHandler Timer.Tick, AddressOf Timer_Tick

こちらですが、サービス処理のタイムアウト対策目的で呼び出しているようです。

> …で、気になるのはそのメインフォームの役割。
> 
> 非表示のままにしている、という点は別に構いませんが、InitializeComponent すら
> 呼んでいないということは、デザイナコードは未使用のはずですし、そうすると
> 待機処理をどこに書いているのだろう、という不安がありました。
> 
> 先のエラーメッセージで、CreateHandle 中の ObjectDisposedException 例外が見えているので、
> 「待機処理を Sub New で行っているのではあるまいか…」という疑念です。
> 要するに、何らかのロード処理(OnLoad メソッドのオーバーライド、または Load イベントの処理)が
> 終わっていない状況で Form が破棄されていて、それがエラーの原因になったのではないか、と。

フォームのLoad処理は、以下の内容になっているのですが・・・
この作りに問題があるのでしょうか?
すみません、他人が作成したプログラムに肉付けしてる状況で理解が追い付いていないところがあります。

    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim strErrMsg As String = ""
        AddHandler Timer.Tick, AddressOf Timer_Tick

        '待機状態
        Cursor.Current = Cursors.WaitCursor

        Try
            If LoadProcess(strErrMsg) = False Then
                If Not String.IsNullOrEmpty(strErrMsg) Then ShowMessage(strErrMsg, MessageBoxIcon.Exclamation)
                Return
            End If

        Catch ex As Exception
            'エラーが発生しました。
            ShowMessage(ex.Message, MessageBoxIcon.Exclamation)
        Finally
            Try
                Me.Close()
            Catch ex As Exception
                MsgBox(ex.Message, MessageBoxIcon.Exclamation)
            End Try
        End Try

    End Sub

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -