DOBON.NETプログラミング道掲示板

No35253 の記事


■35253 / )  Re[6]: Excel Com オブジェクトの増殖
□投稿者/ 魔界の仮面弁士 大御所(1492回)-(2022/11/27(Sun) 22:56:50)
  • アイコンNo35251に返信(たこさんの記事)
    > Dim check As Boolean = False
    > For Each sh In xlsSheets
    >   If CType(sh, Excel.Worksheet).Name = strSheetName Then
    >     check = True
    >     Exit For
    >   End If
    > Next

    ここがマズイですね。
    MRComObject(sh) が明らかに漏れています。


    また、 No35252 でも紹介したように、COM オブジェクトに対して For Each を使うと、
    System.Runtime.InteropServices.ComTypes.IEnumVARIANT インターフェイス
    (を実装した EnumeratorViewOfEnumVariant クラス) の解放を行うことが難しくなるので
    For ループ または Do ループ あるいは While ループ に置き換えることをお奨めします。



    > Private _ExcelVisible As Boolean = True
    > Friend Property ExcelVisible As Boolean
    >   Set(value As Boolean)
    >     _ExcelVisible = value
    >     If Not _xlsApplication Is Nothing Then _xlsApplication.Visible = _ExcelVisible
    >   End Set
    >   Get
    >     Return _ExcelVisible
    >   End Get
    > End Property

    フラグ管理したいのであれば _xlsApplication などの COM オブジェクトを公開してはいけません。
    ExEx1.xlsApplication.Visible を直接操作されたら、上記の _ExcelVisible フラグが連動しなくなりますよね?

    同様に、Range や Worksheet や Workbook などを公開するのも問題があります。
    公開したいのであれば、カプセル化した独自のマネージ クラスを Return するようにします。


    逆に、COM オブジェクトを公開する仕様とするのであれば、ExcelEx 側の役目はヘルパーライブラリに徹するものとし、
    COM オブジェクトの解放タイミングは呼び出し側に担当させる仕様の方が良いでしょう。この場合、下記の 2 つをルールとします。

    (1) プロシージャ内で生成された COM オブジェクトは、ExcelEx 自身が即座に解放する。
    (2) 呼び出し元から渡された COM オブジェクトや、呼び出し元に Return する COM オブジェクトは、呼び出し側で解放する。
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -