tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^2: SeriesCollection.Add後、Excelのタスクが残る
投稿日: 2020/01/29(Wed) 02:26
投稿者OrientalMelody
魔界の仮面弁士様

大変ありがとうございます。

FinalReleaseComObject を使えば、カウント数は消えるようですね。

提示したサンプルは、これで完璧にExcelのタスクは消えるようになりました。

具体的には、
ObjRelease関数を以下のように書き換えました。

''' <summary>
''' Excelオブジェクトの完全な解放
''' </summary>
''' <param name="obj">Excelオブジェクト</param>
Sub ObjRelease(ByRef obj As Object)
    If Not (obj Is Nothing) Then
        'Marshal.ReleaseComObject(obj)
        Dim intCountRCW As Integer = Marshal.ReleaseComObject(obj)
        Debug.WriteLine("intCountRCW = {0}", intCountRCW)
        If intCountRCW > 0 Then
            Dim intCountRCWFinal As Integer = Marshal.FinalReleaseComObject(obj)
            Debug.WriteLine("intCountRCWFinal = {0}", intCountRCWFinal)
        End If
        obj = Nothing
        Threading.Thread.Sleep(3) '2019/12/31
    End If
End Sub

提示したサンプルでは、Finally句の
ObjRelease(rngObj)
のところで、
intCountRCW = 1
となりました。

SeriesCollectionObj.Add(Source:=rngObj)
の引数の方だったのですね。

業務アプリにも反映しようとしたのですが、
例えば、今回修正したFinalReleaseComObjectつきのObjRelease関数を使用して、

Dim xlAppObj As Application = Nothing
Dim wbksObj As Workbooks = Nothing
Dim wbkObj As Workbook = Nothing
Dim wstsObj As Sheets = Nothing

xlAppObj = New Application()
xlAppObj.Visible = True
wbksObj = xlAppObj.Workbooks
wbkObj = wbksObj.Add()
wstsObj = wbkObj.Worksheets

Dim wstObj1 as As Worksheet = Nothing
Dim wstObj2 as As Worksheet = Nothing
wstObj1 = wstsObj(1)
wstObj2 = wstsObj(1)
ObjRelease(wstObj1)

wstObj2 .Activate

みたいなことをすると

「System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.
   at System.StubHelpers.StubHelpers.StubRegisterRCW(Object pThis)
   at Microsoft.Office.Interop.Excel._Worksheet.Activate()」
エラーが発生するようになりました。

これは、
wstObj1 を FinalReleaseComObject すると、
wstObj2 の参照も消えてしまうのですね。

Sub ObjRelease(Of T)(ByRef obj As T)
の記述もこれから行ってみます。

とりあえず、ご連絡まで。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。