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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.100893 の関連記事表示

<< 0 | 1 >>
■100893  COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(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))」
    という例外メッセージが必ず出ます。

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

    原因、対策をご存じの方はおられますでしょうか。
    宜しくお願い致します。
親記事 /過去ログ176より / 関連記事表示
削除チェック/

■100895  Re[1]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ KOZ -(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
    
    
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■100896  Re[1]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ kiku -(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("終了");
            }
    
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

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

    たぶん、COMオブジェクトにて、印刷開始とかの処理があるのかな。
    却下で(笑
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

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

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

    単純にプロセス起動にしていないのは
    BOOKの共有をしている時に、Excelが起動直後、一旦落ちて新しいプロセスIDで起動し直すので
    プロセスIDが取得出来ないという問題があり、COMオブジェクト起動に切り替えたという
    経緯がありました。
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■100899  Re[4]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(2022/11/18(Fri) 20:12:13)
    ありがとうございます!
    大丈夫そうです。
    助かりました!
記事No.100893 のレス / END /過去ログ176より / 関連記事表示
削除チェック/

■101057  Re[5]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(2022/12/22(Thu) 16:05:57)
    すみません、解決していたのですが最近、イベントビューアのApplicationログを
    確認していると以下のエラーが出ていることに気付きました。

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

    なぜ出るのかが分からないのですが、出さないようにすることは出来るのでしょうか・・・
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

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

    支障なく使えているなら無視してもいいような・・・
    毎回出てるんでしょうか?
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101065  Re[7]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(2022/12/23(Fri) 09:00:04)
    KOZ さん

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

    おはようございます、はい、挙動としては問題ないのですが
    毎回上がってきております。
    何が原因なのかさっぱりわからずで・・・
    解決出来ない場合は、そう報告するしかないかなと思っています。
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

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

    何をやったときに出力される、というのは特定できていますか?
    たとえば、PrintExcel.exe のこのコードを通ったときに出力される、とか
    Excel をこう操作したら出力される、等
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

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

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

    KOZさんにいただいたコード内では発生している状況ではないようで現在調査中です。
    何か分かりましたらまたご報告させてください。
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101071  Re[10]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(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[])
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

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

    破棄されたオブジェクトを使おうとして発生する例外っぽいので
    オブジェクトの破棄を処理の最後の方でやるといんじゃないかなって思いました
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101080  Re[11]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ 魔界の仮面弁士 -(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 を表示しないような実装になっているのか。
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101082  Re[11]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ KOZ -(2022/12/27(Tue) 21:02:19)
    No101071 (ジェイド さん) に返信
    
    こんなことやってませんか?
    
    Public Sub New()
        InitializeComponent()
        If 条件 Then
            Me.Close()
        End If
    End Sub
    
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

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

    > 伝説のカレーさん

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

    > 魔界の仮面弁士さん

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

    > KOZさん

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

    大変申し訳ございませんがまたご報告させてください。
    宜しくお願い致します。
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101084  Re[12]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(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が存在していましたが呼び出しはしていないようでした。
    取り急ぎご報告です。
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101085  Re[13]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(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>
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101086  Re[14]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ 魔界の仮面弁士 -(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 が破棄されていて、それがエラーの原因になったのではないか、と。
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101088  Re[15]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド -(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
    
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/

次の20件>

<< 0 | 1 >>

パスワード/

- Child Tree -