Regeln für den Schnittstellenentwurf
Dieser Abschnitt enthält eine kurze Zusammenfassung der Schnittstellenentwurfsregeln und -richtlinien. Einige dieser Regeln sind spezifisch für die COM-Architektur, während andere Einschränkungen durch die Benutzeroberflächendesignsprache MIDL auferlegt werden. Ausführliche Informationen zum COM-Schnittstellenentwurf finden Sie unter Anatomie einer IDL-Datei.
Per Definition ist ein Objekt kein COM-Objekt, es sei denn, es implementiert entweder die IUnknown Schnittstelle oder eine Schnittstelle, die von IUnknownabgeleitet wird. Darüber hinaus gelten die folgenden Regeln für alle Schnittstellen, die in einem COM-Objekt implementiert werden:
- Sie müssen über einen eindeutigen Schnittstellenbezeichner (IID) verfügen.
- Sie müssen unveränderlich sein. Sobald sie erstellt und veröffentlicht wurden, kann sich kein Teil ihrer Definition ändern.
- Alle Schnittstellenmethoden müssen einen HRESULT- Wert zurückgeben, sodass die Teile des Systems, die Remoteverarbeitung verarbeiten, RPC-Fehler melden können.
- Alle Zeichenfolgenparameter in Schnittstellenmethoden müssen Unicode sein.
- Ihre Datentypen müssen remotable sein. Wenn Sie einen Datentyp nicht in einen remotable-Typ konvertieren können, müssen Sie eigene Marshaling- und Unmarshaling-Routinen erstellen. Außerdem hat LPVOID-oder void *keine Bedeutung auf einem Remotecomputer. Verwenden Sie bei Bedarf einen Zeiger, um IUnknownzu.
Anmerkung
Die aktuelle Implementierung von MIDL behandelt keine Funktionsüberladung oder mehrere Vererbung.
Weitere Überlegungen zum Entwurf von Schnittstellen
Verwenden Sie Zeiger auf Daten sehr sorgfältig. Um die Daten im Adressraum des aufgerufenen Prozesses erneut zu erstellen, muss die RPC-Laufzeit die genaue Größe der Daten kennen. Wenn beispielsweise ein CHAR * Parameter auf einen Puffer von Zeichen und nicht auf ein einzelnes Zeichen zeigt, können die Daten nicht ordnungsgemäß neu erstellt werden. Verwenden Sie die in MIDL verfügbare Syntax, um die durch Ihre Typdefinitionen dargestellten Datenstrukturen genau zu beschreiben.
Initialisierung ist für Zeiger unerlässlich, die in Arrays und Strukturen eingebettet sind und über Prozessgrenzen hinweg übergeben werden. Nicht initialisierte Zeiger funktionieren möglicherweise, wenn sie an ein Programm im selben Prozessbereich übergeben werden, aber Proxys und Stubs gehen davon aus, dass alle Zeiger mit gültigen Adressen initialisiert werden oder null sind.
Achten Sie beim Aliasing von Zeigern (sodass Zeiger auf dasselbe Speicherstück zeigen können). Wenn die Aliasierung beabsichtigt ist, sollten diese Zeiger in der IDL-Datei als Alias deklariert werden. Zeiger, die als nichtaliasiert deklariert wurden, sollten sich niemals gegenseitig aliasen.
Achten Sie darauf, wie Sie Arbeitsspeicher zuweisen und freigeben. Denken Sie daran, dass, sofern Sie kein COM-Objekt explizit anweisen (mithilfe der Attributs zuordnen), keine Datenstruktur freizustellen, die während eines Out-of-Process-Aufrufs erstellt wurde, diese Struktur zerstört wird, wenn der Aufruf abgeschlossen ist. Berücksichtigen Sie auch den potenziell destruktiven Aufwand, der durch die ineffiziente Zuordnung von Datenstrukturen entsteht, die jetzt gemarstet und unvermarstet werden müssen.
Achten Sie abschließend darauf, dass Sie beim Definieren ihrer HRESULT- Rückgabewerte keine Fehlercodes erstellen, die mit COM-definierten FACILITY_ITF Codes in Konflikt stehen (Werte zwischen 0x0000 und 0x01FF reserviert sind) oder die mit anderen HRESULT- Werten mit demselben Wert in Konflikt stehen. Verwenden Sie nach Möglichkeit die universellen COM-Erfolgs- und Fehlerrücklaufwerte, und verwenden Sie einen Parameter anstelle eines HRESULT-, um Informationen zurückzugeben, die für den Funktionsaufruf spezifisch sind.
Weitere Informationen finden Sie in den folgenden Themen:
Verwandte Themen