COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

36
COM-Schnittstellen optimal einsetzen Michael Willers [email protected] Microsoft GmbH

description

COM-Schnittstellen optimal einsetzen Michael Willers [email protected] Microsoft GmbH. Agenda. Warum IDL? Wie funktioniert‘s? Wo gibt‘s weitere Info‘s?. Warum IDL?. Warum IDL?. Wie kann ich mit Visual C++... ...Felder an ASP-Scripts übergeben? - PowerPoint PPT Presentation

Transcript of COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Page 1: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

COM-Schnittstellenoptimal einsetzen

Michael [email protected]

Microsoft GmbH

Page 2: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Agenda

Warum IDL? Wie funktioniert‘s? Wo gibt‘s weitere Info‘s?

Page 3: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Warum IDL?

Page 4: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Warum IDL?

Wie kann ich mit Visual C++...

• ...Felder an ASP-Scripts übergeben?

• ...Datenstrukturen abbilden und verwenden?

• ...Zeichenketten optimal einsetzen?

• ...

Page 5: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

No compatibility

• Sämtliche GUIDs werden neu erstellt• Typenbibliothek

• CoKlassen (CLSID)

• Schnittstellen (IID)

Project compatibility

• VB5: CLSID und IID werden neu generiert

• VB6: nur die IIDs werden neu generiert

Binary compatibility

• Sämtliche GUIDs bleiben erhalten

Wie funktioniert‘s?Versionierung von Schnittstellen in VB

Page 6: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?Versionierung von Schnittstellen in VB

Page 7: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Die Auslieferung neuer Client- und Serverversionen erfolgt...

• ...zusammen: Binary Compatibility reicht völlig aus

• ...getrennt: Definieren Sie Ihre Schnittstellen direkt mit der IDL

Wie funktioniert‘s?Versionierung von Schnittstellen in VB

Page 8: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Ein mit VB6 erstellter Client ist grundsätzlich von der IID der Standardschnittstelle abhängig – egal ob er diese benutzt oder nicht!!!

Never use Project Compatibility!!!

Wie funktioniert‘s?Versionierung von Schnittstellen in VB

Page 9: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?Felder und Strukturen

Page 10: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Felder werden grundsätzlich mit dem Typ SAFEARRAY abgebildet

In der IDL-Datei für Scripting Clients immer als VARIANT* deklarieren!!!

Feldelemente müssen grundsätzlich vom Typ VARIANT sein

• Indexüberprüfung mit den Funktionen LBound oder Ubound klappt immer

• Aber: „Type mismatch“ beim Elementzugriff

Wie funktioniert‘s?Übergabe von Feldern an VB-Script

Page 11: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Mit dem Attribut v1_enum werden enum-Werte als 32bit-Werte interpretiert

• sonst 16bit

Seit N4 SP4 kann der Universal Marshaler (OLEAUT32.DLL) auch mit Strukturen umgehen

• Proxy/Stub-Marshaling nicht mehr notwendig

• Windows 95 benötigt DCOM 1.2 oder höher

• In allen Versionen von Windows 98 sowie Windows 2000 fest eingebaut

Wie funktioniert‘s?Aufzählungen (enums) und Strukturen

Page 12: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?SAFEARRAY mit Strukturen

Page 13: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

SAFEARRAY* SafeArrayCreateVectorEx(

VARTYPE vt, // VT_UNKNOWN | FADF_HAVEIID

UINT uLBound,

UINT nSize,

SAVEARRAYBOUND* psaBound,

PVOID pvExtra /*pvExtra: IID* */

);

Wie funktioniert‘s?SAFEARRAYs mit Schnittstellenzeigern

SAFEARRAY *psa;

psa = SafeArrayCreateVectorEx(

VT_UNKNOWN | FADF_HAVEIID,

0,

10,

&IID_IMyInterface

);

Page 14: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Schnittstellentyp zur Compilierzeit festlegen

• HRESULT GetSth([out] ISth **ppISth);

Schnittstellentyp zur Laufzeit festlegen

• HRESULT GetInterfacePtr(

[in] REFIID riid, [out, iid_is(riid)] void **ppv

);

Wie funktioniert‘s?Schnittstellenzeiger

Page 15: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?Stringkonstanten und Win32-API

Page 16: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?Der Universal Marshaler

OLEAUT32.DLL enthält den Universal Marshaler, der Marshaling auf Basis von TypeLibraries durchführen kann

Schnittstellen in der TypeLibrary müssen das IDL-Attribut [dual] oder [oleautomation] aufweisen

TypeLibraries müssen auf Client UND Server registriert werden

• REGTLIB.EXE (ruft RegisterTypeLib auf) Parameter vom Methoden müssen

“VARIANT-compliant” sein

Page 17: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

[in]

• Instanz wird vor Aufruf von Client zum Server übertragen

• Client muss Instanz zerstören

• implementierbar in VB (ByVal)

Wie funktioniert‘s?Richtungsattribute für Parameter

Page 18: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

[out]

• Instanz wird nach Aufruf von Server zum Client übertragen

• Parametertyp muß ein Pointer sein

• Server erzeugt Instanz

• Client muß Instanz zerstören

• nicht implementierbar in VB

Wie funktioniert‘s?Richtungsattribute für Parameter

Page 19: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

[out, retval]

• wie out, kann von Sprachen aber als Rückgabewert einer Funktion interpretiert werden • VB-Objektkatalog

• muss letzter Parameter sein

• implementierbar in VB

Wie funktioniert‘s?Richtungsattribute für Parameter

Page 20: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

[in, out]

• Instanz wird • vor Aufruf von Client zum Server übertragen

• nach Aufruf von Server zum Client übertragen

• sofern der Server andere Instanz zurückgibt, muss alte Instanz im Server zerstört und die zurückgegebene Instanz neu angelegt werden

• Client muss Instanz zerstören

• implementierbar in VB (ByRef)

Wie funktioniert‘s?Richtungsattribute für Parameter

Page 21: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?C-Arrays und C-Strings

Page 22: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

referenzierter Speicher...• ...muß im Serverprozess mit CoTaskMemAlloc

angelegt werden

• ...wird im Serverprozess nach „Aufruf“ durch den Stub mit CoTaskMemFree zerstört

• ...wird im Clientprozess nach „Rückkehr“ durch den Proxy mit CoTaskMemAlloc neu angelegt und initialisiert

• muß im Clientprozess mit CoTaskMemFree zerstört werden

Wie funktioniert‘s?CoTaskMemAlloc und CoTaskMemFree

Page 23: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

[length_is]

• Stub übertragt ausschliesslich Netto-Daten

• Leere Feldelemente werden ignoriert

[size_is]

• Feldgrösse wird zur Laufzeit bestimmt

• Feldgrössen darf nur von [in] oder [in,out] Parametern abhängen

Wie funktioniert‘s?C-Arrays

Page 24: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?C-Arrays

HRESULT GetData3(

[in, out] int* pnCount,[out, size_is(,*pnCount)] unsigned char** ppBuffer

);

// **ppBuffer zeigt auf einen weiteren Zeiger *ppBuffer

// *ppBuffer zeigt auf ein Feld mit (*pnCount) Elementen // vom Typ unsigned char

[size_is(,10)]

• Zeiger, der auf einen Zeiger verweist, der auf ein Feld mit 10 Elementen zeigt

[size_is(10,)]

• Zeiger auf ein Feld mit 10 Zeigern

Page 25: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

[string]

• Variable vom Typ char* oder ein wchar_t* zeigt auf einen nullterminierten String• HRESULT F([in, string] char* psz);

• Attribut bezieht sich immer auf den Zeiger, der char oder wchar_t referenziert• HRESULT F([out, string] char **ppsz);

Wie funktioniert‘s?C-Strings

Page 26: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Problem 1: (&l1, &l2)

• Dereferenzierte Daten müssen übertragen werden

Problem 2: f1(&l1, NULL)

• Dereferenzieren des NULL Pointers

Problem 3: f1(&l1, &l1)

• mehrfaches Dereferenzieren des gleichen Zeigers

Wie funktioniert‘s?Zeigerdatentypen

HRESULT f1([in, out] LONG* pl1, [in, out] LONG* pl2);

Page 27: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Unique Pointers

• IDL-Attribut [unique]

• NULL-Pointer zulässig

• mehrfach referenzierte Daten werden mehrfach übertragen

• Default-Wert in ATL-Projekten• Ändern mit dem IDL-Attribut [pointer_default]

Wie funktioniert‘s?Zeigerdatentypen

Page 28: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Reference Pointers

• IDL-Attribut [ref]

• NULL-Pointer unzulässig

• mehrfach referenzierte Daten werden mehrfach übertragen

• zwingend für Parameter mit dem Attribut [out] und [out, retval]

• Stub prüft auf Gültigkeit, somit werden unnötige Roundtrips eingespart!

Wie funktioniert‘s?Zeigerdatentypen

Page 29: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Full Pointers• IDL-Attribut [ptr]

• NULL-Pointer zulässig

• mehrfach referenzierte Daten werden nur einmal übertragen

• Marshaling über Prozeßgrenzen hinweg wird durch die Überprüfung aller Zeiger auf Überschneidungen zeitaufwendiger

• Attribut immer dann angeben, wenn zwei Zeiger auf den gleichen Speicherbereich verweisen• long l1; HESULT f1(&l1,&l1);

Wie funktioniert‘s?Zeigerdatentypen

Page 30: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wie funktioniert‘s?Strukturen mit Zeigern

Page 31: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Interface muß ausserhalb der Library Section stehen

Interface darf nicht Attribut [local] haben MyFile_i.c, MyFile_p.c, dlldata.c

kompilieren und linken

• in ATL Projekten: NMAKE MyFilePS.mk

REGSVR32 MyFilePS.dll

Wie funktioniert‘s?Proxy/Stub-Marshaling-Code generieren

Page 32: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

IDL-Attribute für Arrays und Strings werden nicht in TLB beschrieben

Proxy/Stub-Marshaling zwingend erforderlich

Proxy/Stub DLL muss erstellt und auf Client- und Server registriert werden

• REGSVR32.EXE

Wie funktioniert‘s?C-Strings, C-Arrays, Zeiger-Strukturen

Page 33: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

nur VB-kompatible Datentypen

• keine C-Arrays

• keine C-Strings

enum: ja struct: ja, wenn Member keine Zeiger keine [out] Parameter

Wie funktioniert‘s?Einschränkungen für Visual Basic

Page 34: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Wo gibt’s weitere Info’s?

msdn online• http://www.microsoft.com/germany/msdn

TechTalk• www.microsoft.com/germany/msdn/techtalk

Bücher• COM IDL and Interface Design

ISBN 1-86100-235-4

Zeitschriften• Microsoft System Journal 6/99, Seite 85

Page 35: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH

Fragen!?

Uff...Uff...

Page 36: COM-Schnittstellen optimal einsetzen Michael Willers mwillers@microsoft Microsoft GmbH