Может ли надстройка COM для Microsoft Access реагировать на файлы базы данных, которые открываются или закрываются? - PullRequest
0 голосов
/ 17 мая 2019

Может ли надстройка VB.Net COM для Microsoft Access 2007 отвечать на файлы базы данных, которые открываются или закрываются ...? Как насчет более поздних версий ..?

Я хотел бы создать надстройку COM, которая выполняет различные функции. Я новичок в этой теме, и после долгих поисков и поисков я смог собрать воедино приведенный ниже код.

Я бы хотел ответить на эти три события:

  1. Доступ открыт для стартовой страницы (файл не открыт).
  2. Файл базы данных открывается.
  3. Файл базы данных закрывается.

Это было создано в Visual Studio 2008 для Access 2007. Первоначально я использовал мастер для расширяемой общей надстройки, но он не работал. Я нашел онлайн пример для C # и смог преобразовать его в VB и заставить его работать. Это в зачаточном состоянии, и только добавляет кнопку на ленте.

Мне все еще неясно, в чем разница между надстройкой VSTO и надстройкой "COM-потребителем", поэтому я не знаю, что мне доступно. Я понимаю, что в Access нет таких событий. Но, хотя, возможно, если бы не было надежного способа ответить на них, я мог бы использовать метод опроса, при котором надстройка пинговала бы Access один раз в секунду, чтобы узнать, открыт ли файл.

Imports Extensibility
Imports System.Runtime.InteropServices
Imports System.Reflection
Imports Microsoft.Office.Core

<GuidAttribute("04AE57EF-2D3A-496A-8A4E-43930FC9CF83"), _
 ProgIdAttribute("AccessDatabaseExplorer.Connect")> _
Public Class Connect

    Implements IDTExtensibility2

    Private app As Object
    Private addin As Object
    Private WithEvents RibbonButton1 As CommandBarButton

    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
        app = application
        addin = addInInst
        If connectMode <> ext_ConnectMode.ext_cm_Startup Then
            OnStartupComplete(custom)
        End If
    End Sub

    Public Sub OnStartupComplete( _
                    ByRef custom As System.Array) _
                    Implements Extensibility.IDTExtensibility2.OnStartupComplete
        CreateRibbonButtons()
    End Sub

    Public Sub OnBeginShutdown( _
                    ByRef custom As System.Array) _
                    Implements Extensibility.IDTExtensibility2.OnBeginShutdown
        Dim omissing As Object = System.Reflection.Missing.Value
        RibbonButton1.Delete(omissing)
        RibbonButton1 = Nothing
    End Sub

    Public Sub OnDisconnection( _
                    ByVal RemoveMode As Extensibility.ext_DisconnectMode, _
                    ByRef custom As System.Array) _
                    Implements Extensibility.IDTExtensibility2.OnDisconnection
        If RemoveMode <> ext_DisconnectMode.ext_dm_HostShutdown Then
            OnBeginShutdown(custom)
        End If
        app = Nothing
    End Sub

    Public Sub OnAddInsUpdate( _
                    ByRef custom As System.Array) _
                    Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
        'Do nothing.
    End Sub

    Private Sub CreateRibbonButtons()

        Dim oCommandBars As CommandBars
        Dim oStandardBar As CommandBar

        oCommandBars = DirectCast(app.GetType().InvokeMember("CommandBars", _
                       BindingFlags.GetProperty, Nothing, app, Nothing), CommandBars)

        oStandardBar = oCommandBars("Database")

        'In case the button was not deleted, use the exiting one.
        Try
            RibbonButton1 = DirectCast(oStandardBar.Controls("My Custom Button"), _
                            CommandBarButton)
        Catch ex As Exception
            Dim omissing As Object = CObj(System.Reflection.Missing.Value)
            RibbonButton1 = DirectCast(oStandardBar.Controls.Add(1, omissing, _
                            omissing, omissing, omissing), CommandBarButton)
            RibbonButton1.Caption = "My Custom Button"
            RibbonButton1.Style = MsoButtonStyle.msoButtonIconAndCaptionBelow
        End Try

        RibbonButton1.Tag = "My Custom Button"
        RibbonButton1.OnAction = "!<MyCOMAddin.Connect>"
        RibbonButton1.Visible = True

        Dim oName As Object = CObj(app.GetType().InvokeMember("Name", 
                              BindingFlags.GetProperty, Nothing, app, Nothing))

        oStandardBar = Nothing
        oCommandBars = Nothing

    End Sub

    Private Sub RibbonButton1_Click( _
                    ByVal Ctrl As CommandBarButton, _
                    ByRef CancelDefault As Boolean) _
                    Handles RibbonButton1.Click
        MessageBox.Show("RibbonButton1 was Clicked", "MyCOMAddin")
    End Sub

End Class
...