Service: C/C++ Tipps: Visual C++ Projektorganisation für ATL-Projekte


Eine besondere Schwierigkeit bei der Programmierung von ATL-COM-Objekten besteht darin, dass ATL-COM-Objekte mit 'normalen' C++-Sprachmitteln keine Vererbung unterstützen. Die Online-Dokumentation empfiehlt, in diesen Fällen mit Aggregation und Delegation zu arbeiten. Genau das Gleiche wird auch in allen gefundenen Web-Artikeln empfohlen.

Die vorlagenbasierte objektorientierte Programmierung (Template Programming) bietet hier eine hervorragende Alternative. Wie diese Technik verwendet wird um Vererbung bei ATL-COM-Objekten einsetzen zu können, habe ich von meinem Kollegen Reinhold Dix von den IT-Profis des IITB (Fraunhofer Institut für Informations- und Datenverarbeitung) Karlsruhe gezeigt bekommen.

Ein Merkmal dieser Technik ist - wie bei jeder vorlagenbasierten Programmierung - dass die Funktionsdefinitionen in Header-Dateien stehen.

Ein anderes Merkmal ist die strikte Trennung zwischen (COM- bzw. IDL-) Schnittstellen-Definition und Implementierung.

Mit VC++ 7.0 wiederum wurde für ATL-COM-Projekte die attributierte Programmierung eingeführt. Bei dieser Technik stehen die IDL-Schnittstellen und die Funktionsdefinitionen in gemeinsamen Header-Dateien. Damit wird zwar die Definition von IDL-Schnittstellen erheblich erleichtert, jedoch ist damit auch ein gravierender Nachteil verbunden: Jedesmal, wenn eine Funktionsdefinition (auch nur minimal) geändert wird, müssen alle Code-Module, die die betreffende Header-Datei eingebunden haben, neu übersetzt (kompiliert) werden.

Unnötige Übersetzungsvorgänge vermeiden

Um in diesem Kontext unnötige Übersetzungsvorgänge zu vermeiden, müssen Schnittstellen und Implementierungen auch physikalisch wieder getrennt werden. D.h. die Schnittstellendefinitionen stehen in einer Datei, die Implementierungen in einer anderen.

Dabei sollten beide Dateien in jedem Fall die Dateinamenerweiterung 'h' haben, damit die IDE sie als Header-Dateien erkennt (und damit die Syntax-Hervorhebung funktioniert). Andererseits sollten die Dateien so benannt werden, dass ihre Zusammengehörigkeit sofort erkennbar ist.

Ich habe dieses Problem so gelöst, dass die Header-Dateien mit den Schnittstellendefinitionen den gleichen Namen erhalten wie die passenden 'reinen' Header-Dateien - jedoch mit einem der Dateinamenerweiterung vorangestellten '.i'. Beispiel:

Dateiname Inhalt
ItemList.h Header-Datei mit (templatebasiertem) Implementierung-Code
ItemList.i.h Auf Attributen basierte ATL-Schnittstellendefinition
Anmerkungen

In den meisten Fällen werden Sie eine zusätzliche *.cpp-Datei benötigen um eine (Dummy-) Instanzvariable des COM-Objektes zu erstellen.

Die (Dummy-) Instanzvariable ist erforderlich, wenn innerhalb des aktuellen Projektes an keiner (anderen) Stelle eine Instanzvariable deklariert ist. Wenn in einem solchen Fall keine (Dummy-) Instanzvariable deklariert wird, erscheint das COM-Objekt nicht in der öffentlichen Schnittstelle des ActiveX-Servers und kann damit in einem ActiveX-Client (wie Visual-Basic) nicht verwendet werden. Deswegen empfiehlt es sich, in jedem Fall die (Dummy-) Instanzvariable zu deklarieren. Dann ist sichergestellt, dass die COM-Schnittstelle immer vollständig ist.

Beachten Sie bitte, dass in diesem Fall auch das Einbinden von stdafx.h erforderlich ist, um bei der Verwendung von vorkompilierten Headern den Übersetzungsfehler C1010 zu vermeiden.

Seitenanfang

Kontaktaufnahme- und Terminvereinbarung:

Bei Fragen und für Terminvereinbarungen erreichen Sie uns unter:

0 63 49 99 07 38

0 151 51 95 34 00

Oder nutzen Sie das Kontaktformular




Ihr Ansprechpartner:


Hier sollte das Fahnungsfoto zu sehen sein.

Ralf Kunsmann

Spezialist für VBA-Programmierung
(alle Office-Anwendungen)
Entwickler der
VBA-Extension-Tools