{"id":55000311,"date":"2022-04-01T00:00:00","date_gmt":"2023-03-02T17:06:08","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=311"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"COMAddIns_mit_twinBASIC","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/COMAddIns_mit_twinBASIC\/","title":{"rendered":"COM-Add-Ins mit twinBASIC"},"content":{"rendered":"<p><b>COM-Add-Ins sind Erweiterungen f&uuml;r Office-Anwendungen und ihre Entwicklungsumgebung, den VBA-Editor. Damit lassen sich Erweiterungen programmieren, die &uuml;ber die Benutzeroberfl&auml;che der jeweiligen Anwendung verf&uuml;gbar gemacht werden und ihre Aufgabe mit oder ohne ein eigenes User Interface bereitstellen. COM-Add-Ins kann man jedoch nicht mit den Mitteln der Office-Anwendungen selbst programmieren. Dazu sind weitere Tools notwendig. Fr&uuml;her ging dies am einfachsten mit Visual Studio 6. Dieses ist jedoch sp&auml;testens seit der Einf&uuml;hrung der 64-Bit-Versionen der Office-Anwendungen nicht mehr nutzbar, sodass Alternativen gefragt sind. Neben Visual Studio .NET, das ebenfalls das Erstellen von COM-Add-Ins erlaubt, erschien vor kurzer Zeit eine neue Alternative: twinBASIC. Ein Projekt von Wayne Phillips, das sich nicht nur anschickt, Nachfolger von Visual Studio 6 zu werden, sondern schon jetzt das Erstellen unter anderem von COM-Add-Ins erm&ouml;glicht. Dieser Artikel stellt die grundlegenden Techniken zum Erstellen eines Ger&uuml;sts f&uuml;r COM-Add-Ins vor, das wir in weiteren Artikeln mit praktischen L&ouml;sungen f&uuml;r die Erweiterung der Office-Anwendungen und auch des VBA-Editors nutzen werden.<\/b><\/p>\n<h2>Vorbereitungen<\/h2>\n<p>Wie wir <b>twinBASIC <\/b>herunterladen und betriebsbereit machen, beschreiben wir im Artikel <b>twinBASIC: Visual Basic f&uuml;r die Zukunft <\/b>(<b>www.vbentwickler.de\/310<\/b>).<\/p>\n<p>Nach dem Start von <b>twinBASIC <\/b>finden wir auf der zweiten Seite des Startdialogs namens <b>Samples <\/b>einige Beispielprojekte vor.<\/p>\n<h2>Erstellen eines COM-Add-In-Projekts<\/h2>\n<p>Wir starten mit einer der praktischen Vorlagen f&uuml;r die Erstellung verschiedener Beispielprojekte, in diesem Fall <b>Sample 5. MyCOMAddIn<\/b> (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_001.png\" alt=\"Erstellen eines COM-Add-Ins auf Basis des passenden Beispiels\" width=\"424,6267\" height=\"413,088\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erstellen eines COM-Add-Ins auf Basis des passenden Beispiels<\/span><\/b><\/p>\n<p>Ein Klick auf diese Schaltfl&auml;che erstellt ein neues Projekt, das zu diesem Zeitpunkt jedoch noch nicht gespeichert ist. Um dieses zu speichern, bet&auml;tigen wir den Men&uuml;befehl <b>File|Save Project<\/b>. Dies &ouml;ffnet, da das Projekt noch ungespeichert ist, einen <b>Save Project As&#8230;<\/b>-Dialog. Mit diesem navigieren wir zu dem gew&uuml;nschten Zielordner und geben den Dateinamen f&uuml;r das Projekt ein, der die Dateiendung <b>.twinproj <\/b>tr&auml;gt (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_002.png\" alt=\"Festlegen des Speicherorts f&uuml;r die .twinproj-Datei\" width=\"599,6265\" height=\"325,8201\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Festlegen des Speicherorts f&uuml;r die .twinproj-Datei<\/span><\/b><\/p>\n<p>Schauen wir dann in das Verzeichnis, in dem wir das neue Projekt angelegt haben, stellen wir fest, dass hier tats&auml;chlich nur eine Datei vorliegt &#8211; es gibt aktuell noch keine weiteren Elemente.<\/p>\n<p>Damit kehren wir zur&uuml;ck zur <b>twinBASIC<\/b>-Entwicklungsumgebung, die das neu erstellte Projekt anzeigt.<\/p>\n<h2>Module des Beispielprojekts<\/h2>\n<p>Das Projekt enth&auml;lt zu diesem Zeitpunkt zwei Module:<\/p>\n<ul>\n<li>Das erste hei&szlig;t <b>MyCOMAddin.twin <\/b>und wird direkt beim Start im zentralen Bereich der Entwicklungsumgebung angezeigt. Es enth&auml;lt im Falle eines COM-Add-Ins den gesamten Code des Projekts. Wir schauen uns diesen weiter unten an.<\/li>\n<li>Das zweite ist das Modul <b>DllRegistration.twin<\/b>. Dieses enth&auml;lt Informationen, die erstens beim Erstellen des Projekts zum Testen in die Registry geschrieben werden und die auch beim manuellen Registrieren mit <b>RegSvr32.exe <\/b>verwendet werden. Auch den Inhalt dieses Moduls schauen wir uns gleich im Detail an.<\/li>\n<\/ul>\n<h2>F&uuml;r welche Anwendung soll das COM-Add-In eingesetzt werden?<\/h2>\n<p>Die wichtigste Frage, die wir beantworten m&uuml;ssen, bevor wir das Add-In &uuml;berhaupt testweise erstellen, ist die nach der Anwendung, in der das Add-In seine Funktionen zur Verf&uuml;gung stellen soll.<\/p>\n<p>Aktuell gehen wir davon aus, dass es sich dabei um eine der folgenden Office-Anwendungen handelt:<\/p>\n<ul>\n<li>Access<\/li>\n<li>Excel<\/li>\n<li>Outlook<\/li>\n<li>PowerPoint<\/li>\n<li>Word<\/li>\n<\/ul>\n<p>Oder wollen wir das COM-Add-In sogar f&uuml;r mehrere Office-Anwendungen gleichzeitig verf&uuml;gbar machen? Das ist m&ouml;glich, aber es stellt sich die Frage, ob es Anwendungsf&auml;lle gibt, die in allen Office-Anwendungen n&uuml;tzlich sind. Tats&auml;chlich gehen wir davon aus, dass ein COM-Add-In eher auf eine Office-Anwendung spezialisiert ist. Dennoch zeigen wir, wie wir das COM-Add-In f&uuml;r mehrere Office-Anwendungen gleichzeitig bereitstellen k&ouml;nnen.<\/p>\n<h2>Soll das COM-Add-In f&uuml;r eine 32-Bit- oder f&uuml;r eine 64-Bit-Anwendung kompiliert werden?<\/h2>\n<p>Die zweite Frage, die sich stellt, ist die nach der Architektur der Office-Installation: Ist diese f&uuml;r 32-Bit- oder f&uuml;r 64-Bit ausgelegt? Wir befinden uns in einem Wandel, denn bis vor kurzer Zeit hat das Office-Setup standardm&auml;&szlig;ig die 32-Bit-Version von Office installiert. Mit Office 2016 und den entsprechenden Versionen unter Office 365 hat sich dies jedoch ge&auml;ndert. Hier landet nun standardm&auml;&szlig;ig die 64-Bit-Version auf dem Rechner.<\/p>\n<p>Das Problem ist nun, dass auch COM-Add-Ins f&uuml;r die entsprechende Version, also 32-Bit oder 64-Bit, kompiliert werden m&uuml;ssen. Unter twinBASIC ist das ein kleines Problem, wenn auch mit gewissen Einschr&auml;nkungen. Wir k&ouml;nnen zwar die entsprechende Zielversion (<b>win32 <\/b>oder <b>win64<\/b>) vor der Kompilierung ausw&auml;hlen. Allerdings ist twinBASIC nur f&uuml;r die 32-Bit-Version kostenlos. Wenn wir die 64-Bit-Version kompilieren, wird sowohl w&auml;hrend der Kompilierung als auch bei Start des COM-Add-Ins jeweils ein Dialog des Herstellers mit dem <b>twinBASIC<\/b>-Logo eingeblendet.<\/p>\n<p>F&uuml;r Entwicklungszwecke und zum Ausprobieren ist das kein Problem. Wir gehen jedoch davon aus, dass wir, wenn wir mit <b>twinBASIC <\/b>erstellte Anwendungen beim Kunden einsetzen wollen, auch die anfallenden (&uuml;berschaubaren) Lizenzgeb&uuml;hren gerne entrichten.<\/p>\n<h2>Schnellstart mit dem Beispiel-COM-Add-In<\/h2>\n<p>Wir wollen direkt einmal das vorgefertigte Beispiel ausprobieren und klicken nach der Auswahl der Zielversion (32-Bit oder 64-Bit) direkt auf die Schaltfl&auml;che <b>Build <\/b>in der Men&uuml;leiste (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_003.png\" alt=\"Erstellen des COM-Add-Ins\" width=\"700\" height=\"133,0578\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Erstellen des COM-Add-Ins<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen wir das COM-Add-In in Excel und auch in Access ausprobieren. Wenn wir Excel &ouml;ffnen, finden wir die M&ouml;glichkeit zum Aufrufen der Funktion des COM-Add-Ins im Ribbon unter <b>twinBASIC Test<\/b>. Ein Klick auf die in diesem Tab enthaltene Schaltfl&auml;che zeigt ein Meldungsfenster an (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_004.png\" alt=\"Aufruf des COM-Add-Ins von Excel aus\" width=\"574,6265\" height=\"246,9887\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Aufruf des COM-Add-Ins von Excel aus<\/span><\/b><\/p>\n<p>Das gleiche Ergebnis erhalten wir mit diesem COM-Add-In auch, wenn wir Access &ouml;ffnen.<\/p>\n<h2>Anpassung der Zielanwendung<\/h2>\n<p>Der erste Schritt der Anpassung des COM-Add-Ins soll sich auf die Anwendung beziehen, in welcher dieses angezeigt wird. Diese Einstellung nehmen wir im Modul <b>DllRegistration <\/b>vor.<\/p>\n<p>Hier finden wir den Code aus Listing 1. Wir sehen ganz oben, dass unter <b>twinBASIC <\/b>Standardmodule in <b>Module [Modulname] <\/b>und <b>End Module <\/b>eingefasst werden m&uuml;ssen. Wir sehen au&szlig;erdem einige Konstanten, welche Informationen enthalten, die in den beiden weiter unten definierten Funktionen zum Einsatz kommen. Die erste speichert den Namen des Projekts, der aus <b>VBA.Compilation.CurrentProjectName <\/b>bezogen wird. Die Klasse <b>Compilation <\/b>ist eine <b>twinBASIC<\/b>-Erweiterung, die Informationen &uuml;ber das aktuelle Projekt liefert und deren Member wir beispielsweise wie in Bild 5 per IntelliSense abfragen k&ouml;nnen. In diesem Fall ermitteln wir den aktuellen Projektnamen. Wie wir den Projektnamen anpassen, zeigen wir weiter unten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_005.png\" alt=\"Die Compilation-Klasse per IntelliSense\" width=\"624,6265\" height=\"253,9691\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die Compilation-Klasse per IntelliSense<\/span><\/b><\/p>\n<p>Die zweite Konstante namens <b>AddinClassName <\/b>erh&auml;lt den Namen der Klasse des Add-Ins. Dieser sollte mit dem Namen der Klasse im anderen Modul des Projekts &uuml;bereinstimmen, in diesem Fall <b>MyCOMAddin<\/b>. Die n&auml;chste Konstante <b>AddinQualifiedClassName <\/b>f&uuml;gt die beiden vorher definierten Konstanten, also <b>AddinProjectName <\/b>und <b>AddinClassName <\/b>zusammen.<\/p>\n<p>Schlie&szlig;lich folgen noch zwei Konstanten namens <b>RootRegistryFolder_ACCESS <\/b>und <b>RootRegistryFolder_EXCEL<\/b>, welche die Pfade zu den zu erstellenden Eintr&auml;gen f&uuml;r das COM-Add-In in der Registry aufnehmen. F&uuml;r Access entsteht so beispielsweise der folgende Wert f&uuml;r diese Konstante:<\/p>\n<pre>HKCU\\SOFTWARE\\Microsoft\\Office\\Access\\Addins\\MyCOMAddin.MyCOMAddin\\<\/pre>\n<h2>Wozu Registry-Eintr&auml;ge?<\/h2>\n<p>Warum machen wir in Zusammenhang mit der Installation eines COM-Add-Ins &uuml;berhaupt so einen Wirbel um Registry-Eintr&auml;ge? Der Grund ist einfach: Die Office-Anwendungen scannen beim Starten einen bestimmten Bereich der Registry, wo die f&uuml;r die jeweilige Anwendung registrierten COM-Add-Ins aufgelistet werden. Die dort angegebenen DLLs werden beim Start der Anwendung ausgelesen und dort untergebrachte Schnittstellen f&uuml;r die Anpassung von Ribbondefinitionen angewendet.<\/p>\n<p>Um zu pr&uuml;fen, ob das soeben erstellte COM-Add-In seinen Platz in der Registry gefunden hat, brauchen wir eigentlich nicht die Registry zu &ouml;ffnen, denn wir haben uns ja durch Starten der Anwendungen <b>Access <\/b>und <b>Excel <\/b>davon &uuml;berzeugt, dass das COM-Add-In f&uuml;r die beiden Anwendungen installiert ist.<\/p>\n<p>Dennoch schauen wir uns die Registry an, wobei wir diese mit dem Befehl <b>RegEdit<\/b> &uuml;ber das <b>Suchen<\/b>-Feld von Windows &ouml;ffnen.<\/p>\n<p>Hier navigieren wir zum folgenden Eintrag:<\/p>\n<pre>Computer\\HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Office\\Excel\\Addins\\MyCOMAddin.MyCOMAddin<\/pre>\n<p>Dies ist beispielsweise der Eintrag f&uuml;r Excel. F&uuml;r diesen wurden einige Werte hinterlegt (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_006.png\" alt=\"Das Add-In f&uuml;r Excel in der Registry\" width=\"599,6265\" height=\"219,6909\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Das Add-In f&uuml;r Excel in der Registry<\/span><\/b><\/p>\n<p>Diese haben die folgende Bedeutung:<\/p>\n<ul>\n<li><b>Description<\/b>: Beschreibung, die beispielsweise im Bereich <b>Add-Ins <\/b>der Optionen der jeweiligen Anwendung auftaucht<\/li>\n<li><b>FriendlyName<\/b>: Name des COM-Add-Ins, wie er in der Liste der COM-Add-Ins im Dialog <b>COM-Add-Ins <\/b>auftaucht<\/li>\n<li><b>LoadBehaviour<\/b>: Verhalten beim Laden. Normalerweise soll hier der Wert <b>3 <\/b>stehen f&uuml;r <b>Beim Start Laden<\/b>. Diesen Wert sehen wir ebenfalls im Dialog <b>COM-Add-Ins<\/b>.<\/li>\n<\/ul>\n<p>Die Werte f&uuml;r <b>FriendlyName <\/b>und <b>Description <\/b>sowie den Speicherort der DLL finden wir nach der Installation des COM-Add-Ins beispielsweise f&uuml;r Excel im Optionen-Dialog im Bereich <b>Add-Ins<\/b>.<\/p>\n<p>Die einzelnen Werte haben wir in Bild 7 hervorgehoben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_007.png\" alt=\"COM-Add-Ins in den Excel-Optionen\" width=\"700\" height=\"369,9999\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: COM-Add-Ins in den Excel-Optionen<\/span><\/b><\/p>\n<p>W&auml;hlen wir hier im unteren Bereich f&uuml;r das Kombinationsfeld <b>Verwalten <\/b>den Wert <b>COM-Add-Ins <\/b>aus und klicken auf die Schaltfl&auml;che <b>Los&#8230;<\/b>, finden wir den Dialog aus Bild 8 vor. Hier sehen wir auch den aktuellen Wert f&uuml;r die Eigenschaft <b>Ladeverhalten<\/b>, in diesem Fall <b>Beim Start laden<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_008.png\" alt=\"Der Dialog COM-Add-Ins\" width=\"649,627\" height=\"253,0125\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Der Dialog COM-Add-Ins<\/span><\/b><\/p>\n<h2>Funktion zum Einrichten der Registry-Eintr&auml;ge<\/h2>\n<p>Nachdem wir uns nun mit der Bedeutung des Vorhandenseins gewisser Registry-Eintr&auml;ge besch&auml;ftigt haben, wollen wir uns ansehen, wie diese dorthin gelangen.<\/p>\n<p>Diese Aufgabe &uuml;bernimmt die Funktion <b>DllRegisterServer <\/b>im Modul <b>DllRegistration<\/b>. Diese Funktion erzeugt eine Instanz des Objekt <b>wscript.shell<\/b>, welches beispielsweise die Methode <b>RegWrite <\/b>zum Schreiben von Registry-Eintr&auml;gen bereitstellt. Diese nutzen wir, um die ben&ouml;tigten Eintr&auml;ge mit den Werten, die teilweise aus den oben definierten Konstanten stammen, zur Registry hinzuzuf&uuml;gen.<\/p>\n<p>Das alles geschieht unter Deaktivierung der eingebauten Fehlerbehandlung mit <b>On Error Goto RegError<\/b>. Tritt beim Anlegen der Registry-Eintr&auml;ge ein Fehler auf, zeigt die Funktion ein Meldungsfenster mit Details zum aufgetretenen Fehler an.<\/p>\n<h2>Wann wird DllRegisterServer aufgerufen?<\/h2>\n<p>Es gibt zwei Gelegenheiten, zu denen die Funktion <b>DllRegister <\/b>aufgerufen wird. Die erste ist das Bet&auml;tigen der <b>Build<\/b>-Schaltfl&auml;che in der <b>twinBASIC<\/b>-Entwicklungsumgebung.<\/p>\n<p>Ob sie dadurch tats&auml;chlich aufgerufen wird, k&ouml;nnen wir anschlie&szlig;end am Vorhandensein der dort definierten Registry-Eintr&auml;ge feststellen. Wir k&ouml;nnen aber auch einfach eine <b>MsgBox<\/b>-Anweisung einbauen und uns beispielsweise den Pfad in der Registry ausgeben lassen, in welchen die Registry-Informationen geschrieben werden.<\/p>\n<p>Der zweite Zeitpunkt, zu dem diese Funktion aufgerufen wird, ist die Registrierung auf dem jeweiligen Zielrechner mit der Anweisung <b>RegSvr32.exe <\/b>entweder &uuml;ber die Eingabeaufforderung oder auch per Batch-Datei.<\/p>\n<p>Wenn wir die COM-Add-In-Datei also auf einen anderen Rechner kopiert haben und diese installieren wollen, m&uuml;ssen wir diese mehr oder weniger von Hand registrieren, wenn wir nicht gerade ein Setup f&uuml;r das COM-Add-In erstellt haben. Wie wir ein solches Setup erstellen, erl&auml;utern wir noch in einem weiteren Beitrag.<\/p>\n<p>&Uuml;ber die Eingabeaufforderung gelingt das wie folgt:<\/p>\n<ul>\n<li>Als Erstes starten wir die Eingabeaufforderung, und zwar im Administrator-Modus. Dazu geben wir im Suchen-Feld von Windows den Text <b>cmd<\/b> ein und klicken dann mit der rechten Maustaste auf den nun im Suchergebnis erscheinenden Eintrag <b>Eingabeaufforderung<\/b>. Im Kontextmen&uuml; w&auml;hlen wir <b>Als Administrator ausf&uuml;hren <\/b>aus.<\/li>\n<li>Danach navigieren wir zu dem Verzeichnis, in dem sich die <b>.dll<\/b>-Datei befindet, in diesem Fall auf dem Desktop. <\/li>\n<li>Hier geben wir den Befehl <b>Regsvr32.exe MyCOMAddin_win64.dll <\/b>ein.<\/li>\n<li>Hier erhalten wir dann im Optimalfall die Meldung, dass die DLL erfolgreich registriert wurde (siehe Bild 9).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_311_009.png\" alt=\"Installieren per Eingabeaufforderung\" width=\"549,6265\" height=\"220,2271\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Installieren per Eingabeaufforderung<\/span><\/b><\/p>\n<\/ul>\n<p>Wir sehen, dass wir die <b>twinBASIC<\/b>-Funktion <b>DllRegisterServer <\/b>auch von der Kommandozeile aus aufrufen k&ouml;nnen. Das er&ouml;ffnet uns auch die M&ouml;glichkeit, dort weitere Mechanismen unterzubringen, die f&uuml;r die Verwendung des COM-Add-Ins noch hilfreich sein k&ouml;nnen &#8211; beispielsweise das Anlegen bestimmter Dateien mit Konfigurationsdateien, die Anzeige von Meldungen w&auml;hrend der Installation et cetera.<\/p>\n<p>Den Befehl <b>Regsvr32.exe <\/b>k&ouml;nnen wir in eine Batch-Datei schreiben und diese dann im Administratormodus aufrufen. Diese Datei nennen wir einfach <b>Register.bat<\/b>. Wenn wir diese Datei im gleichen Verzeichnis platzieren wie die zu registrierende Datei, brauchen wir noch nicht mal den Pfad zur zu registrierenden <b>.dll<\/b>-Datei anzugeben, wie es eigentlich n&ouml;tig w&auml;re, wenn wir nicht in der Eingabeaufforderung zum Verzeichnis mit der <b>.dll<\/b>-Datei navigiert h&auml;tten.<\/p>\n<h2>Funktion zum Entfernen der Registry-Eintr&auml;ge<\/h2>\n<p>Wenn wir ein Element durch Hinzuf&uuml;gen von Eintr&auml;gen zur Registry installieren, wollen wir dieses auch wieder deinstallieren k&ouml;nnen. Dazu k&ouml;nnen wir die Funktion <b>DllUnregisterServer <\/b>nutzen. Der Aufbau dieser Funktion ist dem der Prozedur zum Hinzuf&uuml;gen der Registry-Eintr&auml;ge recht &auml;hnlich. Allerdings nutzen wir hier nicht die Methode <b>RegWrite <\/b>der Klasse <b>wscript.shell<\/b>, sondern die Methode <b>RegDelete<\/b>.<\/p>\n<p>Hier sind nicht nur drei Aufrufe n&ouml;tig, sondern noch ein weiterer. Beim Registrieren werden n&auml;mlich automatisch alle Ordner angelegt, die zu den hinzuzuf&uuml;genden Registry-Eintr&auml;gen f&uuml;hren &#8211; in diesem Fall der Ordner aus der Konstanten <b>AddinQualifiedClassName<\/b>. Den so angelegten Ordner m&uuml;ssen wir beim Deinstallieren nach dem L&ouml;schen der eigentlichen Registry-Eintr&auml;ge separat wieder entfernen.<\/p>\n<p>Der Rest l&auml;uft wie beim Anlegen der Registry-Eintr&auml;ge ab.<\/p>\n<p>Wenn wir die Registrierung auf dem Zielrechner wieder aufheben wollen, k&ouml;nnen wir wie beim Registrieren vorgehen &#8211; wir rufen in der f&uuml;r den Administratorzugriff ge&ouml;ffneten Eingabeaufforderung den gleichen Befehl auf, diesmal allerdings mit dem Parameter <b>-u<\/b>:<\/p>\n<pre>Regsvr32 MyCOMAddin_win32.dll -u<\/pre>\n<h2>Bedingungen f&uuml;r das Registrieren und Deregistrieren von COM-Add-Ins<\/h2>\n<p>Wenn wir ein COM-Add-In f&uuml;r eine Anwendung registrieren, k&ouml;nnen wir dies unabh&auml;ngig davon erledigen, ob die Zielanwendung aktuell ge&ouml;ffnet ist oder nicht. Die einzige Konsequenz, wenn die Anwendung ge&ouml;ffnet ist, ist folgende: Das COM-Add-In ist dann nicht sofort, sondern erst beim n&auml;chsten &Ouml;ffnen der Anwendung verf&uuml;gbar.<\/p>\n<p>Beim Registrieren im Rahmen des Erstellens des COM-Add-Ins von der twinBASIC-Entwicklungsumgebung aus sollten wir die Zielanwendungen jedoch immer schlie&szlig;en. Ansonsten kann es vorkommen, dass beim Versuch, die bestehende Version der <b>.dll<\/b>-Datei zu l&ouml;schen und diese neu zu erstellen, ein Fehler auftritt, weil die <b>.dll<\/b>-Datei gerade in Verwendung ist.<\/p>\n<h2>Modul DLLRegistration auf die Zielanwendung anpassen<\/h2>\n<p>Wenn wir entschieden haben, f&uuml;r welche Anwendung das COM-Add-In zum Einsatz kommen soll, k&ouml;nnen wir die beiden Funktionen <b>DllRegister <\/b>und <b>DllUnregister <\/b>entsprechend anpassen. Wir k&ouml;nnen dann zuerst einen Satz von Registry-Informationen entfernen. Dann passen wir die Funktionen wie folgt an. Die Funktion <b>DLLRegister<\/b> sieht dann wie in Listing 2 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DllRegisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n     <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n     wscript.RegWrite RootRegistryFolder & \"FriendlyName\", AddinProjectName + \"_Friendly\", \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder \"Description\", AddinProjectName + \"_Description\", \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n     Return <span style=\"color:blue;\">True<\/span>\r\nRegError:\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"DllRegisterServer -- An error occured trying to write to the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n             Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n     Return <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000311\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000311?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000311\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"0c38ab74e4\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>COM-Add-Ins sind Erweiterungen f&uuml;r Office-Anwendungen und ihre Entwicklungsumgebung, den VBA-Editor. Damit lassen sich Erweiterungen programmieren, die &uuml;ber die Benutzeroberfl&auml;che der jeweiligen Anwendung verf&uuml;gbar gemacht werden und ihre Aufgabe mit oder ohne ein eigenes User-interface bereitstellen. COM-Add-Ins kann man jedoch nicht mit den Mitteln der Office-Anwendungen selbst programmieren. Dazu sind weitere Tools notwendig. Fr&uuml;her ging dies am einfachsten mit Visual Studio 6. Dieses ist jedoch sp&auml;testens seit der Einf&uuml;hrung der 64-Bit-Versionen der Office-Anwendungen nicht mehr nutzbar, sodass Alternativen gefragt sind. Neben Visual Studio .NET, das ebenfalls das Erstellen von COM-Add-Ins erlaubt, erschien vor kurzer Zeit eine neue Alternative: twinBASIC ist ein Projekt von Wayne Phillips, das sich nicht nur anschickt, Nachfolger von Visual Studio 6 zu werden, sondern schon jetzt das Erstellen unter anderem von COM-Add-Ins erm&ouml;glicht. Dieser Artikel stellt die grundlegenden Techniken zum Erstellen eines Ger&uuml;sts f&uuml;r COM-Add-Ins vor, das wir in weiteren Artikel mit praktischen L&ouml;sungen f&uuml;r die Erweiterung der Office-Anwendungen und auch des VBA-Editors nutzen werden.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022022,662022,44000034,44000021],"tags":[],"yst_prominent_words":[],"class_list":["post-55000311","post","type-post","status-publish","format-standard","hentry","category-66022022","category-662022","category-COMAddIns_programmieren","category-Entity_Framework"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000311"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000311\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000311"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}