Marshaling

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Einfache COM-Server erstellen - Index


Bei Out-of-Process-Servern und Remote-Servern müssen Sie berücksichtigen, auf welche Weise COM das Marshaling und die Übertragung der Daten aus dem aktuellen Prozess heraus vornimmt. Sie können diese Funktionalität folgendermaßen zur Verfügung stellen:

  • Automatisch durch Verwendung der Schnittstelle IDispatch.
  • Automatisch durch Erstellen einer Typbibliothek zusammen mit dem Server und Markieren der Schnittstelle mit dem OLE-Automatisierungs-Flag. COM weiß, wie der Marshaling-Mechanismus aller automatisierungskompatiblen Typen in der Typbibliothek erfolgen muss und kann die Proxy-Server und Stubs entsprechend einrichten. Für das automatische Marshaling gelten einige Einschränkungen bezüglich der verwendbaren Typen.
  • Manuell durch Implementierung aller Methoden der Schnittstelle IMarshal. Dies wird als benutzerdefiniertes Marshaling bezeichnet.

Hinweis: Die erste Methode (mit IDispatch) steht nur auf Automatisierungs-Servern zu Verfügung. Die zweite Methode steht automatisch bei allen Objekten zur Verfügung, die von Experten erstellt werden und eine Typbibliothek verwenden.

Automatisierungskompatible Typen

Funktionsergebnisse und Parametertypen der in dualen und Dispatch-Schnittstellen deklarierten Methoden sowie der Schnittstellen, die Sie als "OLE-Automatisierung" markieren, müssen automatisierungskompatibel sein. Die folgenden Typen sind OLE-automatisierungskompatibel:

Erstens: Die vordefinierten gültigen Typen wie Smallint, Integer, Single, Double, WideString. Eine vollständige Liste finden Sie unter Gültige Typen.

Zweitens: In einer Typbibliothek definierte Aufzählungstypen. OLE-automatisierungskompatible Aufzählungstypen werden als 32-Bit-Werte gespeichert und bei der Parameterübergabe als Werte vom Typ Integer behandelt.

Drittens: In einer Typbibliothek definierte Schnittstellentypen, die OLE-automatisierungssicher sind, d.h. von der Schnittstelle IDispatch abgeleitet wurden und nur OLE-automatisierungskompatible Typen enthalten.

Viertens: In einer Typbibliothek definierte dispinterface-Typen.

Fünftens: Alle in der Typbibliothek definierten benutzerdefinierten Datensatztypen.

Sechstens: IFont, IStrings und IPicture. Für die folgenden Zuordnungen müssen Hilfsobjekte instantiiert werden:

  • IFont zu TFont
  • IStrings zu TStrings
  • IPicture zu TPicture

Der Experte für ActiveX-Steuerelemente und der ActiveForm-Experte erstellen diese Hilfsobjekte bei Bedarf automatisch. Wenn Sie diese Hilfsobjekte verwenden möchten, rufen Sie die betreffende globale Routine auf: GetOleFont, GetOleStrings oder GetOlePicture.

Typspezifische Einschränkungen beim automatischen Marshaling

Damit eine Schnittstelle das automatische Marshaling (auch Automatisierungs-Marshaling oder Typbibliotheks-Marshaling genannt) unterstützt, müssen bestimmte Einschränkungen beachtet werden: Wenn Sie ein Automatisierungsobjekt mit dem Typbibliothekseditor bearbeiten, erzwingt dieser die folgenden Einschränkungen:

  • String-Datentypen müssen als Wide-Strings (BSTR) übertragen werden. Werte vom Typ PChar bzw. UnicodeString und AnsiString können nicht sicher übertragen werden.
  • Alle Elemente einer dualen Schnittstelle müssen HRESULT als Rückgabewert der Funktion übergeben. Wird die Methode mit der safecall-Aufrufmethode deklariert, tritt diese Bedingung automatisch in Kraft, wobei der deklarierte Rückgabetyp in einen Ausgabeparameter konvertiert wird.
  • Elemente einer dualen Schnittstelle, die andere Werte zurückgeben müssen, sollten diese Parameter als var oder out zurückgeben, wodurch ein Ausgabeparameter angegeben wird, der den Funktionswert zurückgibt.

Hinweis: Ein Verfahren, um die Typeinschränkungen bei der Automatisierung zu umgehen, besteht darin, eine separate IDispatch-Schnittstelle und eine benutzerdefinierte Schnittstelle zu implementieren Auf diese Weise können Sie die volle Bandbreite möglicher Argumenttypen nutzen. Dies bedeutet, dass die COM-Clients wahlweise die benutzerdefinierte Schnittstelle verwenden können, auf welche die Automatisierungs-Controller dennoch Zugriff haben. In diesem Fall müssen Sie allerdings den Quelltext für das Marshaling manuell implementieren.

Benutzerdefiniertes Marshaling

In der Regel werden Sie für Ihre Out-of-Process-Server und Remote-Server automatisches Marshaling verwenden, weil dies einfacher ist; COM erledigt hierbei die Arbeit für Sie. Es kann jedoch Fälle geben, in denen Sie benutzerdefiniertes Marshaling zur Verfügung stellen möchten, wenn Sie davon ausgehen können, dass das manuelle Marshaling im betreffenden Fall schneller abläuft. Bei der Implementierung eines benutzerdefinierten Marshaling-Mechanismus müssen Sie die Schnittstelle IMarshal unterstützen. Weitere Informationen zu diesem Ansatz finden Sie in der entsprechenden Microsoft-Dokumentation.

Siehe auch