ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 04.07.2000

Diese Seite wurde zuletzt aktualisiert am 04.07.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für IE, Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss der AVB-Web-Site zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

COM-AddIns mit Gegenverkehr

Zurück...


Anzeige

Von Tom Jürgens mailto:juergens@organice.de und Harald M. Genauck mailto:hg_vbaaddinobject@aboutvb.de

COM-AddIns für die Microsoft Office Anwendungen und andere Anwendungen, die VBA und COM-AddIns unterstützen, sind eine feine Sache. Sie können in einem solchen COM-AddIn neue Symbolleisten und Objekte anlegen, die auf Mausklick oder Tastendruck reagieren und so diese Anwendungen um nahezu beliebige Funktionalität erweitern. Allerdings scheint das AddIn vollkommen von der Anwendung abgeschottet zu sein, von der es geladen worden ist. Aus dem VBA-Code, aus Makros und Modulen, haben Sie offensichtlich keine Möglichkeit, auf das AddIn zuzugreifen - genauer gesagt: funktional zuzugreifen und öffentliche Objekte Ihres AddIns zu nutzen.

Ihr AddIn finden Sie zwar sehr wohl als COMAddIn-Objekt in der COMAddIns-Collection des jeweiligen Application-Objects über den üblichen ProgId-Namen ("Projektname.AddInKlasse") wieder. Ein Blick im Objekt-Katalog auf das COMAddIn-Objekt fördert eine Reihe von Eigenschaften zu Tage, die eher "bürokatischen" Zwecken dienen - bis auf die Eigenschaft Object. Und genau diese enthält... NICHTS!

Wo also steckt nun Ihr AddIn tatsächlich? Es steckt in der Tat irgendwie in oder hinter dem COMAddIn-Objekt. Doch VBA ist nicht in der Lage, die öffentlichen Schnittstellen Ihres AddIns bzw. der Objekte desselben direkt zugänglich zu machen.

Aber werfen wir einmal einen Blick auf das OnConnection-"Ereignis" des AddIn-Designers in Visual Basic. Der folgende Versuch zeigt Ihnen, welcher Art das dort im Parameter AddInInst übergeben Objekt ist:

Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
 ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
 ByVal AddInInst As Object, custom() As Variant)

  Debug.Print TypeName(AddInInst)
End Sub

Ausgegeben wird "COMAddIn"! So weit so gut - aber bis jetzt ist das immer noch eine Einbahnstraße. Und auch hier ergibt die Prüfung, was sich denn nun in der Object-Eigenschaft des COMAddIn-Objekts befinden könnte weiterhin Nothing.

Vielleicht haben Sie auch schon vermutet, dass diese Object-Eigenschaft der gesuchte Verbindungskanal sein könnte, und versucht, ein Objekt Ihres AddIns zu instanzieren und dieser Object-Eigenschaft zuzuweisen. Angenommen, Ihr öffentliches Objekt hieße CTest:

Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
 ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
 ByVal AddInInst As Object, custom() As Variant)

  Set AddInInst.Object = New CTest
End Sub

Pech gehabt - VB quittiert den Versuch mit dem Laufzeitfehler 438 - "Objekt unterstützt diese Eigenschaft oder Methode nicht."

Probieren Sie es aber einmal - natürlich vollkommen regelwidrig - ohne das Set-Schlüsselwort, ist VB glücklich und zufrieden:

Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
 ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
 ByVal AddInInst As Object, custom() As Variant)

  AddInInst.Object = New CTest
End Sub

Ein einfaches Beispiel für Ihr Objekt-Klasse CTest (Instancing 5 - MultiUse) könnte etwa folgendermaßen aussehen:

Private mName As String

Public Property Get Name() As String
  Name = "Ich heiße " & mName
End Property

Public Property Let Name(New_Name As String)
  mName = New_Name
End Property

Schauen wir nun auf der anderen Seite in einer COM-AddIn-fähigen Anwendung nach, etwa in Microsoft Word, ob Ihr Objekt tatsächlich dort ankommt und nutzbar wird. In einem Standard-Modul dort könnte beispielsweise folgendes Makro stehen, das Sie auch mit einem Symbol einer Symbolleiste verbinden können:

Public Sub AddInTest()
  Dim objCOMAddIn As Object
  Dim objAddIn As Object
  
  Set objCOMAddIn = _
   application.COMAddIns("avbAddInPublicObject.Connect")
  If objCOMAddIn.Connect Then
    Set objAddIn = objCOMAddIn.Object
    If objAddIn Is Nothing Then
      MsgBox "Object ist Nothing!"
    Else
      With objAddIn
        .Name = InputBox("Geben Sie einen Namen ein:")
        MsgBox .Name
      End With
    End If
  Else
    MsgBox "COMAddIn ist nicht geladen!"
  End If
End Sub

Siehe da: Wenn Ihr AddIn als COMAddIn geladen ist, steht Ihr Objekt nunmehr wie erhofft zur Verfügung.


Beispiel-Projekt avbAddInPublicObject (addinobject.zip - ca. 18,6 KB)



VBA-Übersicht

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer