Vortrag Grundlagen der COM-Programmierung



Ähnliche Dokumente
Einführung in COM Seite 1

Software Reuse Sommer OLE, DCOM und COM Die frühen. Komponentenmodelle der Firma Microsoft. Object Linking and Embedding (Compound Documents)

Application Frameworks and Componentware Wintersemester 2002/03. COM+ Entwicklungsschritte. In-Place Activation OSF DCE RPC 1992 DCOM 1996

Office in Java. 2. Info-Point Urs Frei

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Inhalt. 1. Motivation. 2. COM Architektur. 3. COM Implementierung. 4. Zusammenhang zu ATL. 5. Beispiel COM Client/ Server. 6..

Themen. Web Service - Clients. Kommunikation zw. Web Services

Objektorientierte Programmierung

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Remote Method Invocation

Szenario 3: Service mit erweiterter Schnittstelle

Java RMI Remote Method Invocation

Große Übung Praktische Informatik 1

xgu 2.0 Installationsanleitung Installationsanleitung Excel Add-In zu ASTAG GU Kalkulationsgrundlage Bern, 19. August 2014 Version: 01.

Seminar Komponentenorientierte Softwareentwicklung

Zählen von Objekten einer bestimmten Klasse

Javakurs zu Informatik I. Henning Heitkötter

IPETRONIK TESTdrive SDK V02.00

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

Java: Vererbung. Teil 3: super()

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

Factory Method (Virtual Constructor)

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

ATHOS Benutzertreffen

Tritt beim Aufruf ein Fehler aus, so wird eine MessageBox mit dem Fehlercode und der Kommandozeile angezeigt.

COM-Add-Ins installieren

Prinzipien Objektorientierter Programmierung

Wiederholung: Beginn

1. Übung zu "Numerik partieller Differentialgleichungen"

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

mobilepoi 0.91 Demo Version Anleitung Das Software Studio Christian Efinger Erstellt am 21. Oktober 2005

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Vorkurs C++ Programmierung

Java Einführung Packages

Anleitung zum Prüfen von WebDAV

P-touch Transfer Manager verwenden

Java und XML 2. Java und XML

Arbeiten mit UMLed und Delphi

Typumwandlungen bei Referenztypen

Einführung in die Programmierung

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Erstellen eines Office-COM-Add-In mit Visual Basic 2005 Express Edition

Testen mit JUnit. Motivation

Alltagsnotizen eines Softwareentwicklers

KAPITEL. Ernst Pfannenschmidt und Paul Watzlaw

Delegatesund Ereignisse

ArcObjects-Programmierung mit Delphi. Marko Apfel, Team Entwicklung

Elexis-BlueEvidence-Connector

Assoziation und Aggregation

Das Component Object Model (COM)

Der lokale und verteilte Fall

Objektbasierte Entwicklung

Step by Step Softwareverteilung unter Novell. von Christian Bartl

C# im Vergleich zu Java

11.1 Indirektes Binden (3) 11.1 Indirektes Binden (4) Objektadapterkonfiguration. Unmittelbarer Vorteil des indirekten Bindens

Programmieren in Java

Einführung in die C++ Programmierung für Ingenieure

Einführung in Javadoc

Kommandozeilenparameter der SelectLine Applikationen

Vererbung & Schnittstellen in C#

8.3 COM und DCOM (Microsoft)

Architektur des agimatec-validation Frameworks

Netzwerkversion PVG.view

Gebundene Typparameter

DLLs (dynamic loaded libraries) mit MingW erstellen

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Objektorientierte Programmierung. Kapitel 12: Interfaces

1 Vom Problem zum Programm

Java Virtual Machine (JVM) Bytecode

Algorithmen und Datenstrukturen

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Datentypen: Enum, Array, Struct, Union

Applet Firewall und Freigabe der Objekte

FIREBIRD BETRIEB DER SAFESCAN TA UND TA+ SOFTWARE AUF MEHR ALS EINEM COMPUTER

Gemeinsamer Bibliotheksverbund: Übertragung von Datenexporten für den Verbundkatalog Öffentlicher Bibliotheken

Übungen zu Softwaretechnik

Übung - Datenmigration in Windows Vista

Installation und Benutzung AD.NAV.ZipTools

Updateseite_BuV-PlugIn-NERZ-Gesamt

Microsoft.NET Framework & Component Object Model. ein Vortrag von Florian Steuber

Inhaltsverzeichnis. Teil I Grundlagen der Programmarchitektur Vorwort... XIII XV XVI XVI

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Hinweise zur Datensicherung für die - Prüfmittelverwaltung - Inhalt

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

3 Objektorientierte Konzepte in Java

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Visual C++ Windows-Programmierung mit den MFC. Frank Budszuhn. ADDISON-WESLEY An imprint of Pearson Education

Medea3 Print-Client (m3_print)

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

affilinet_ Flash-Spezifikationen

WPF Steuerelemente Listbox, ComboBox, ListView,

MPI-Programmierung unter Windows mit MPICH2. Installieren von MPICH2, Übersetzen, Ausführen und Debuggen von MPI-Programmen. Christian Terboven

Transkript:

Schulungsdokument Vortrag Grundlagen der COM-Programmierung Konfigurationsidentifizierung (KI): CTB003202 Funktion Name Organisationseinheit Erstellung Mario Becker BDS

Inhalt ➀ Funktionsweise von COM ➁ Interfaces ➂ Registrierung von COM-Komponenten ➃ Marshalling ➄ Erzeugen und Verwenden von COM-Objekten ➅ Automation ➆ Duale Schnittstellen ➇ Interface Definition Language (IDL) ➈ Type Library ➉ Verschiedenes ➊ Anwendungsbeispiele Voraussetzungen Advanced C++ (RTTI, Templates) Windows-Programmierung mit Visual C++ Zielsetzung Grundlagen der COM-Programmierung unter Verwendung des Win32 COM APIs. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 1

Terminologie COM Spezifikation, die das binäre Layout von Software-Komponenten, bzw. Objekten, festlegt und angibt, wie diese Komponenten untereinander kommunizieren können. DCOM (Distributed COM): Erweiterung des COM-Mechanismus über Netzwerkgrenzen hinweg. COM-Server DLL- oder EXE-Datei, die ein oder mehrere COM-Klassen (CoClass) enthalten kann. Beispiele für COM-Server: MS-Word oder Excel. COM-Klassen Deklarationen von COM-Objekten in einem COM-Server, die noch nicht instanziiert wurden. Eine COM-Klasse kann ein oder mehrere Interfaces besitzen, wobei jedes Interface ein oder mehrere Funktionen deklariert. Interface besteht aus einer Gruppe von Zeigern, die ihrerseits auf Funktionen zeigen. COM-Interfaces sind als vtables realisiert, die sich wie virtuelle Funktionen in C++ verhalten. COM-Objekt Instanziierung einer COM-Klasse und belegt wie ein C++-Objekt Speicher. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 2

Ausprägungsformen von COM-Servern in-process: Server wird als DLL implementiert und wird vom Client bei Bedarf geladen. Er wird im Adressraum des Clients ausgeführt. out-of-process: Server wird als EXE-Datei implementiert und in seinem eigenen Adressraum ausgeführt. remote service: Server steht über ein Netzwerk - ein LAN, WAN oder Internet - als Service zur Vefügung. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 3

Interfaces COM-Objekte kommunizieren nur über Interfaces mit anderen Objekten, bzw. Clients. Ein Interface ist eine Tabelle von Funktionszeigern, die ihrerseits auf die vom Objekt zu implementierenden Funktionen zeigen. Die Zeigertabelle wird auch als vtable bezeichnet. Implementierung von Interfaces pfunca pfuncb pfuncc pfunca() pfuncb() pfuncc() Interface Pointer vtable Objekt mit Memberfunktionen Verwendung einer vtable ist vorgeschrieben. vtable muß ab Offset 0 im COM-Objekt liegen (Binärkompatibilität). Interface-Pointer: Zeiger auf einen Speicherbereich, der unter Win32 in den ersten 4 Bytes einen Pointer auf eine vtable enthält CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 4

Visuelle Darstellung von COM-Schnittstellen UML-Notation: Unified Modelling Language. Namen von Interfaces beginnen mit I. Beispiel IUnbekannt IDispatch IMyInterface MyComObject CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 5

Arten von COM-Schnittstellen Custom Interfaces: reine vtable-schnittstellen (abgeleitet von IUnknown), Automation Interfaces: reine Dispatch-Schnittstellen - oder dispinterfaces (abgeleitet von IDispatch). Duale Schnittstellen (auch abgeleitet von IDispatch), Hybrid aus vtable- und Dispatch-Interfaces. Anmerkung: Mit Visual Basic können nur duale Schnittstellen definiert werden, auch wenn extern definierte, reine vtable- oder Dispatch-Interfaces benutzt werden können. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 6

Versionierung Objects as Contracts: eineveröffentliche Schnittstelle darf nicht mehr nachträglich verändert werden. Die Implementierung des Interface kann sich aber sehr wohl ändern. Bei Änderungen oder Erweiterungen: => neues Interface schaffen. Beispiel: Erweiterung eines Interfaces IOldInterface pa pb pc INewInterface pb pc pone ptwo Objects still maintain functions for old and new interfaces A() B() C() One() Two() CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 7

Unique Identifiers (UUIDs) Festlegung eindeutiger Namen für COM-Objekte, Interfaces, usw. Format: 128-Bit-Zahl, (normalerweise als Strings von Hex-Zahlen), z.b.: {000209FE-0000-0000-C000-000000000046} Open Group Algorithmus zur Erzeugung von UUIDs. Aktuelles Datum und Uhrzeit Netzwerkadresse des Computers Taktzähler. Arten von UUIDs GUID: Globally Unique ID, bezeichnet UUID aus der COM-Welt. CLSID: Class ID,für Klassen-Objekte. IID: Interface-ID, für Schnittstellen. REFIID: Referenz-IID, C++-Typ: Referenz auf eine IID. appid: für Anwendungen. catid: für Kategorien (siehe HKEY_CLASSES_ROOT\Component Categories). progid: UUID in menschenlesbarer Form, Namenskollisionen möglich. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 8

Erzeugung von UUIDs GUIDGEN: Visual C++ Tool, Kopiert UUID in Clipboard. uuidgen: Kommandozeilentool unter DOS. programmatische Erzeugung: CoCreateGUID (ruft UuidCreate auf). Beispiel für eine progid {000209FE-0000-0000-C000-000000000046}: CLSID des Automation-Objekts von Word95. Zugehörige progid: word.basic. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 9

IUnknown COM-Interface, dessen Funktionen von jedem COM-Objekt implementiert werden müssen. Definition (C++) class IUnknown { public: virtual HRESULT QueryInterface(REFIID riid, LPVOID FAR* ppv) = 0; virtual ULONG AddRef() = 0; virtual ULONG Release() = 0; }; QueryInterface Parameter REFIID: Referenz auf eine IID. LPVOID FAR*: 32-Bit void* Zeiger. Rückgabewert HRESULT: 32-Bit-Wert, Status der COM-Operation, z.b. S OK. Test von HRESULT: Makros FAILED und SUCCEEDED. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 10

AddRef und Release Synopsis ULONG AddRef() ULONG Release() Verwaltung der Lebensdauer von COM-Objekten. Referenzzähler-Mechanismus. Garbage Collection. Regeln Zeigerzuweisung auf das Interface eines COM-Objektes: explizites AddRef. QueryInterface ruft AddRef automatisch auf. Jedes Interfaces muß AddRef und Release implementieren. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 11

Registrierung von COM-Komponenten HKEY_CLASSES_ROOT Enthält die GUIDs für COM (wird auf HKEY_LOCAL_MACHINE\Software\Classes abgebildet). COM-Informationen in der Registry HKEY_CLASSES_ROOT file extensions.bmp.doc.xls progids der Server- Anwendungen progids Paint.Picture CLSID CLSID Liste aller CLSIDs CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 12

Server Registrierung Jeder Server registriert sich selbst in der Registry, indem er seine CLSID seinem eigenen Dateinamen zuordnet. COM-Komponente werden beim Übersetzen mit Visual C++ automatisch registriert. EXE-Server: -RegServer / -UnRegServer. DLL-Server: exportiert DllRegisterServer und DllUnregisterServer. Programme regsvr32 dllservername regsvr32 /u dllservername CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 13

Marshalling 1.Fall: DLL-Server (in-process) Client Process Server DLL Client Server Direkte Aufrufe von Interface-Funktionen. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 14

2.Fall: EXE-Server (out-of-process) Client Process Server Process Proxy Stub Client DLL Proxy DLL Stub Server Marshalling zur Parameterübergabe. Proxy: Läuft im Adressraum des Clients, Abbild des Interfaces. Stub: auf Serverseite, Unmarshalling. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 15

Erzeugen von COM-Objekten Win32 COM API Funktion CoCreateInstance. Beispiel IUnknown* punk; HRESULT hr = CoCreateInstance ( CLSID_MySrv, // GUID NULL, // Res. for aggr. CLSCTX_SERVER, // type: server IID_UNKNOWN, // interf. pointer (void **)&punk); // Store pointer Weiterverwendung des Interface-Pointers IDispatch *pdisp; hr = punk->queryinterface(iid_dispatch, reinterpret_cast<void**>(&pdisp)); if(failed(hr)) { AfxMessageBox("QueryInterface on IDispatch failed"); } CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 16

Wiederverwendung von Komponenten Das verwendete Objekt: inneres Objekt. Das Objekt, das Gebrauch von einem anderen macht: äußeres Objekt. Containment/Delegation Die Methoden des äußeren Objekts werden durch Methodenaufrufe des inneren Objekts realisiert. Aggregation Spezialfall von Containment. Kein Implementierungsoverhead wie beim Containment. vtable-mechanismus. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 17

Class Factories Jedes COM-Objekt wird duch eine sog. Class Factory erzeugt. IClassFactory class IClassFactory : public IUnknown { virtual HRESULT CreateInstance(LPUNKNOWN punk, REFIID riid, void ** ppv) = 0; virtual HRESULT LockServer(BOOL flock) = 0; } IClassFactory2 Lizensierungsfunktionen (ActiveX). IClassFactory2 IClassFactory CreateInstance() LockServer() CreateInstance() LockServer() GetLicInfo() RequestLicKey() CreateInstanceLic() CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 18

Automation Fernsteuerung von COM-Objekten durch Clients durch IDispatch-Interface. IDispatch interface IUnknown : public IUnknown { public: virtual HRESULT GetTypeInfoCount (UINT* pctinfo) =0; virtual HRESULT GetTypeInfo (UINT itinfo, LCID lcid, ITypeInfo** pptinfo) = 0; virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames (REFIID riid, LPOLESTR* rgsznames, UINT cnames, LCID lcid, DISPID* rgdispid) = 0; } virtual HRESULT Invoke (DISPID dispidmember, REFIID riid, LCID lcid, WORD wflags, DISPPARAMS pdispparams, VARIANT* pvarresult, EXCEPINFO* pexcepinfo, UINT* puargerr) = 0; CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 19

Varianten Übertragung von Daten in einem sprach- und maschinenunabhängigen Format. Wird für Automation verwendet. Struktur, die einen Typenbezeichner und eine Union enthält. Die Union enthält zulässigen Standard Datentypen als Wert. Warum Varianten? Ziel: Automation-Objekt über IDispatch-Interface aufrufen. Wenn es kein Headerfile gibt: // compile error ISomeInterface->SomeFunctionNotDeclaredOnClient(); Lösung: Funktion in String verpacken IDispatch->RemoteInvokeMethodByName( "SomeFunctionNotDeclaredOnClient"); Frage: wie werden die Argumente übergeben? Automation verwendet spezielle Datentypen (Automation Types) union AnyOfThese { int ival; float fval; char cval; // and every other automation type // that late binding supports } CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 20

Diskriminator zur Typangabe: enum types { VT_INT, VT_FLOAT, VT_CHAR }; struct Variant { enum types discriminator; } union AnyOfThese { int ival; float fval; char cval; // and every other automation type // that late binding supports } Zugriffsfunktion Variant args[2]; Variant retval; args[0].discriminator = VT_INT; args[0].ival = 2; args[1].discriminator = VT_INT; args[1].ival = 3; IDispatch->RemoteInvoke ("Add", args, &retval); Und fertig ist das Late Binding. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 21

Duale Schnittstellen Late Binding Zugriff auf COM-Objekte über IDispatch zur Laufzeit. Verwendet Automation Types. I.d.R. keine Headerfiles oder Type Library vorhanden. Early Binding Custom Interface: Referenzen auf COM-Objekt werden zur Compilezeit aufglöst. bedingt Proxy DLL. Keine Einschränkungen bzgl. der Typen. Schneller als Late Binding. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 22

Dual Interfaces Schnittstellen, die sowohl Late, als auch Early Binding unterstützen. Dispatch Interface (Invoke) oder direkte Benutzung der vtable. Schneller als Dispatch-Interfaces, langsamer als Custom Interfaces unterstützt die Entwicklung Sprachunabhängiger Server. Faustregel Für jede COM-Klasse, die Non-Automation Types verwendet, muß eine Proxy-DLL für die Client-Anwendung ausgeliefert werden. (Proxy-DLL = Stellvertreter für die COM-Klasse auf der Client-Seite). CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 23

IDL Sprachunabhängige Beschreibung von Schnittstellen. Übersetzung mit MIDL-Compiler => Type Library (.tlb-datei). MIDL new.tlb Typbibliothek (library) new.idl MIDL dlldata.c new.h COM Interface Schlüsselwort [object] new_i.c new_p.c RPC Interface new_c.c new_s.c new.h Assistenten Die MFC- und ATL-Assistenten generieren die IDL für den Proxy, (genauso wie den Stub und die Type Library). CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 24

Type Library Beschreibt alle Klassen, Methoden (und Argumente) eines COM-Servers. Sprachneutrales, binäres Headerfile (enthält keinen Programmcode). Late Binding und Early Binding. Kann von jeder COM-fähigen Sprache verwendet werden. Unterstützt Sprachunabhängigkeit. Quelltext (.idl oder.odl) => MIDL => Kompilat (.tlb). #import Anweisung: Visual C++ 6.0 CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 25

Type Lib Viewer Anzeige von Typ-Bibliotheken. Aufruf: Menü File/View Type Lib im OLE/COM Object Viewer Beispiel CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 26

#import Makro Generierung von Headerdateien zur Auflösung von Early Binding Referenzen. Lesen:.tlb => #import => Header.tli und.tlh Beispiel Visual C++ Datei: TLB-Datei einlesen #import "sometypelib" no_namespace named_guids Optionale Argumente nonamespace: Klassen nicht in einem eigenen Namensraum erzeugen. named guids: Erzeugung menschenlesbarer Namen für GUIDs. EXE und DLLs #import kann auch TLB aus EXE oder DLL lesen. Beispiel Visual C++ Datei: DLL-Datei einlesen #import "myactivexserver" CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 27

Was #import sonst noch kann... Erweiterte Benutzungsform für Methoden Normalerweise: RV aller Interface-Methoden ist HRESULT [id(1), helpstring("method Add")] HRESULT Add([in] int x, [in] int y, [out, retval] int * r); Sonderbedeutung von retval: iresult = Add (1, 2); Raw Funktions #import generiert Raw Functions, so daß Methoden auch mit Ausgabeparametern (anstelle von RVs) verwendet werden können. Beispiel int iresult; //this also works pcalc->raw_add(1,2,&iresult); cout<< "Raw Addition is:" << iresult <<endl; CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 28

Zeichensätze Zeichensätze für Win32- und COM-Programmierer Unicode: 16-Bit ANSI: 8-Bit Makros und Funktionen CHAR: für ANSI-Zeichen. WCHAR: für UNICODE-Zeichen. TCHAR, T und LPTSTR: für Festlegung des Zeichensatztyps zur Compilierzeit. OLECHAR und L: für Unicode-Strings. CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 29

Beispiele TCHAR und T STDMETHODIMP CComSrvObj::Message() { TCHAR txt[100]; wsprintf(txt, _T("Pong %x"), reinterpret_cast<const char*> (static_cast<iinterface1*>(this))); MessageBox(NULL, txt, _T("DllServer"), MB_OK); return S_OK; } OLECHAR und L OLECHAR *name = L"add"; idsp->getidsofnames (IID_NULL, &name, 1, GetUserDefaultLCID(), &dispid); idsp->invoke (dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &dp, &result, 0, 0); cout << "Addition is:" << result.lval <<endl; CT-B KI: CTB003202 Ausg.: 1 / Vers.: 1 Datum: 08. März 1999 Seite: 30