Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

COM-Schnittstellen optimal einsetzen Michael Willers Microsoft GmbH.

Ähnliche Präsentationen


Präsentation zum Thema: "COM-Schnittstellen optimal einsetzen Michael Willers Microsoft GmbH."—  Präsentation transkript:

1 COM-Schnittstellen optimal einsetzen Michael Willers Microsoft GmbH

2 Agenda Warum IDL? Wie funktionierts? Wo gibts weitere Infos?

3 Warum IDL?

4 Wie kann ich mit Visual C Felder an ASP-Scripts übergeben?...Datenstrukturen abbilden und verwenden?...Zeichenketten optimal einsetzen?...

5 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 funktionierts? Versionierung von Schnittstellen in VB

6

7 Die Auslieferung neuer Client- und Serverversionen erfolgt......zusammen: Binary Compatibility reicht völlig aus...getrennt: Definieren Sie Ihre Schnittstellen direkt mit der IDL Wie funktionierts? Versionierung von Schnittstellen in VB

8 Achtung: Wenn Sie per New ein neues Objekt erstellen, passieren unter VB6 folgende Dinge: Aufruf von CoCreateInstance mit IUnknown Aufruf von QueryInterface mit der IID der Standardschnittstelle Der Aufruf von QueryInterface erfolgt grundsätzlich! Wie funktionierts? Versionierung von Schnittstellen in VB

9 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 funktionierts? Versionierung von Schnittstellen in VB

10 Wie funktionierts? Felder und Strukturen

11 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 funktionierts? Übergabe von Feldern an VB-Script

12 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 funktionierts? Aufzählungen (enums) und Strukturen

13 Wie funktionierts? SAFEARRAY mit Strukturen

14 SAFEARRAY* SafeArrayCreateVectorEx( VARTYPE vt, // VT_UNKNOWN | FADF_HAVEIID UINT uLBound, UINT nSize, SAVEARRAYBOUND* psaBound, PVOID pvExtra /*pvExtra: IID* */ ); Wie funktionierts? SAFEARRAYs mit Schnittstellenzeigern SAFEARRAY *psa; psa = SafeArrayCreateVectorEx( VT_UNKNOWN | FADF_HAVEIID, 0, 10, &IID_IMyInterface );

15 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 funktionierts? Schnittstellenzeiger

16 Wie funktionierts? Stringkonstanten und Win32-API

17 Wie funktionierts? Stringkonstanten [ uuid(90c05dc7-0d82-43de-803e-527f32c2a32d), version(1.0) ] library StringConstants { module Constants { [ helpstring("Zitatzeichen") ] const LPSTR vbSingleQuote = "'"; [ helpstring("Anfuehrungszeichen") ] const LPSTR vbQuote = "\""; };

18 Wie funktionierts? Win32-API [ uuid(1ba14ad2-566e-478b-88aa-db3046a0eb49), version(1.0) ] library MyTestLib { [dllname("KERNEL32")] module MyKernel32 { [entry("RtlMoveMemory"),helpstring(memcpy)] void _stdcall RtlMoveMemory( void* pvDst, void* pvSrc, long cbCopy ); };

19 Wie funktionierts? 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

20 [in] Instanz wird vor Aufruf von Client zum Server übertragen Client muss Instanz zerstören implementierbar in VB (ByVal) Wie funktionierts? Richtungsattribute für Parameter

21 [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 funktionierts? Richtungsattribute für Parameter

22 [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 funktionierts? Richtungsattribute für Parameter

23 [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 funktionierts? Richtungsattribute für Parameter

24 Wie funktionierts? C-Arrays und C-Strings

25 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 funktionierts? CoTaskMemAlloc und CoTaskMemFree

26 [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 funktionierts? C-Arrays

27 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

28 [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 funktionierts? C-Strings

29 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 funktionierts? Zeigerdatentypen HRESULT f1([in, out] LONG* pl1, [in, out] LONG* pl2);

30 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 funktionierts? Zeigerdatentypen

31 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 funktionierts? Zeigerdatentypen

32 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 funktionierts? Zeigerdatentypen

33 Wie funktionierts? top level und embedded pointer struct MyStruct {[ref] LONG* pl; } HRESULT F1(MyStruct* pMyStruct); HRESULT F2(LONG** ppl); embedded pointer top level pointer embedded pointertop level pointer

34 Wie funktionierts? Marshaling von embedded pointern 5pl1:NULL ProxyStub ? Obj Process 1Process 2 pl1:... f1(&pl1) pl1:NULL pl1:... 5 HRESULT f1([out] LONG** ppl1); Aufruf: f1(&l1);

35 l2:5l1:3l1:7l2:1 Wie funktionierts? Marshaling von top level pointern HRESULT f1([in, out] LONG* pl1, [in, out] LONG* pl2); Aufruf: f1(&l1, &l2); ProxyStub l1:3l2:5l1:7l2:1 Obj Process 1 Process2 f1(&l1, &l2)

36 Wie funktionierts? Strukturen mit Zeigern

37 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 funktionierts? Proxy/Stub-Marshaling-Code generieren

38 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 funktionierts? C-Strings, C-Arrays, Zeiger-Strukturen

39 nur VB-kompatible Datentypen keine C-Arrays keine C-Strings enum: ja struct: ja, wenn Member keine Zeiger keine [out] Parameter Wie funktionierts? Einschränkungen für Visual Basic

40 Wo gibts weitere Infos? msdn online TechTalk Bücher COM IDL and Interface Design ISBN Zeitschriften Microsoft System Journal 6/99, Seite 85

41 Fragen!? Uff...

42


Herunterladen ppt "COM-Schnittstellen optimal einsetzen Michael Willers Microsoft GmbH."

Ähnliche Präsentationen


Google-Anzeigen