0

Visual Studio 2008 で共有アドインを作成し、共有アドイン ウィザードを使用して、VB でコーディングしています。Access 2003 でアドインを実行するときに、ユーザーがデータベースを開いているかどうかを確認したいので、OnConnection プロシージャで AccessApplication 変数をアプリケーション オブジェクトに設定し、ボタン クリックで AccessApplication.CurrentDB Is Nothing If かどうかを確認します。開いているデータベースはありません。ボタンをクリックすると、Access は正しく閉じます。しかし、データベースが開いている場合は、VS デバッガーで Access を停止する必要があります。

以下の OnConnection、OnDisconnection、および OnClick の手順を見つけてください。

Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection
    m_oTestMenu.Delete()
    m_oTestBtn.Delete()

    m_oTestMenu = Nothing
    m_oTestBtn = Nothing

    AccessApplication = Nothing
End Sub

Public Sub OnConnection(ByVal application As Object, ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection
    Dim oCommandBars As Microsoft.Office.Core.CommandBars

    On Error GoTo ErrHandler

    AccessApplication = CType(application, Microsoft.Office.Interop.Access.Application)

    oCommandBars = AccessApplication.CommandBars

    ' Add the menu to the existing menu list
    m_oTestMenu = AddMenu(oCommandBars, "Test", "Test")

    ' Now create menu options
    m_oTestBtn = AddMenuButton(m_oTestMenu, _
        "TestBtn", MsoButtonStyle.msoButtonIconAndCaption, "Test Btn", MsoButtonState.msoButtonUp)

    ' Clean up
    oCommandBars = Nothing
    Exit Sub 

ErrHandler: oCommandBars = Nothing MsgBox("エラー") End Sub

Private Sub m_oTestBtn_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean) Handles m_oTestBtn.Click
    Dim AccessDB As dao.Database

    On Error GoTo ErrHandler

    AccessDB = AccessApplication.CurrentDb

    MsgBox("DB Found " & AccessDB.Name)

    'Try To Close Everything
    AccessDB.Close()
    AccessDB = Nothing

    AccessApplication.CurrentDb.Close()
    AccessApplication = Nothing

    Exit Sub

ErrHandler: MsgBox("Click Error") AccessDB = Nothing End Sub

4

1 に答える 1

2

この記事を見つけたことで

http://www.xtremebbtalk.com/showthread.php?t=160433

OnDisconnect 手順の最後に手動でガベージ コレクションを行う必要があったようです。

追加した

        GC.Collect()
    GC.WaitForPendingFinalizers()

OnDisconnect 関数の最後まで Access が閉じます

これが他の人の助けになることを願っています

于 2009-01-20T13:58:01.440 に答える