Objektattribut
Das [object]- Schnittstellenattribute identifiziert eine COM-Schnittstelle. (Eine Schnittstellenattributeliste, die das Attribut [object] nicht enthält, gibt eine DCE-RPC-Schnittstelle an.)
[
object,
uuid(string-uuid)
[ , interface-attribute-list]
]
interface interface-name : base-interface
{
...
}
Parameter
-
string-uuid
-
Eine vom Uuidgen-Hilfsprogramm generierte UUID-Zeichenfolge. Sie können die UUID-Zeichenfolge in Anführungszeichen einschließen.
-
interface-attribute-list
-
Andere Attribute, die für die Schnittstelle als Ganzes gelten.
-
Schnittstellenname
-
Der Name der Schnittstelle.
-
Basisschnittstelle
-
Die COM-Schnittstelle, von der diese Schnittstelle abgeleitet wird. Die Basisschnittstelle muss IUnknown, IDispatch oder eine andere COM-Schnittstelle sein, die entweder direkt oder indirekt von IUnknown oder IDispatch abgeleitet wird.
Bemerkungen
Eine Schnittstellenattributeliste für eine COM-Schnittstelle muss das [uuid] -Attribut enthalten, darf aber nicht das [version] -Attribut enthalten.
Beim Kompilieren einer COM-Schnittstelle mit dem MIDL-Compiler werden standardmäßig die Dateien generiert, die zum Erstellen einer Proxy-DLL erforderlich sind. Diese DLL enthält den Code, um die Verwendung der benutzerdefinierten COM-Schnittstelle sowohl durch Clientanwendungen als auch durch Objektserver zu unterstützen. Wenn die Schnittstellenattributeliste für eine COM-Schnittstelle jedoch das Attribut [local] angibt, generiert der MIDL-Compiler nur die Schnittstellenheaderdatei.
Der MIDL-Compiler generiert automatisch einen Schnittstellendatentyp für eine COM-Schnittstelle. Alternativ können Sie typedef mit der Schnittstelle Schlüsselwort (keyword) verwenden, um explizit einen Schnittstellendatentyp zu definieren. Die Schnittstellenspezifikation kann dann den Schnittstellendatentyp in Funktionsparametern und Rückgabewerten, Struktur- und Unionmembern sowie andere Typdeklarationen verwenden. Das folgende Beispiel veranschaulicht die Verwendung eines automatisch generierten IStream-Datentyps :
[
object,
uuid (ABCDEFOO-1234-1234-5678-ABCDEF123456)
]
interface IStream : IUnknown
{
typedef IStream * LPSTREAM;
// Other interface definition statements.
}
In einer COM-Schnittstelle wird davon ausgegangen, dass alle Schnittstellenmemberfunktionen virtuelle Funktionen sind. Eine virtuelle Funktion verfügt über einen impliziten Zeiger als ersten Parameter. Die virtuelle Funktionstabelle enthält einen Eintrag für jede Schnittstellenelementfunktion.
Nicht-[lokale] Objektschnittstellenmitgliedsfunktionen müssen den Rückgabewert HRESULT oder SCODE aufweisen. (Beachten Sie, dass in früheren Versionen von MIDL Memberfunktionen void zurückgegeben werden konnten. Ab MIDL Version 3.0 generiert die Rückgabe von void jedoch einen Compilerfehler.) Der Rückgabewert HRESULT oder SCODE bedeutet, dass die generierten Proxys die Ausnahme abfangen und den Ausnahmecode im Rückgabewert zurückgeben, wenn während eines Remoteaufrufs eine Ausnahme generiert wird. Wenn ihre Anwendung es sich leisten kann, Fehler zu ignorieren, die während eines Remoteprozeduraufrufs auftreten, können Sie HRESULT als Rückgabetyp angeben, ohne den Rückgabewert nach dem Aufruf zu überprüfen.
Wenn Sie eine alte Anwendung neu kompilieren, kann das Ändern der Rückgabetypen zu Abwärtskompatibilitätsproblemen führen, wenn der Server das neu eingeführte Ergebnis an den Client sendet. Alternativ zum Ändern des Rückgabetyps können Sie die Funktion, die void zurückgibt, mit dem [call_as] -Attribut bezeichnen und so zu einer lokalen Funktion machen. Definieren Sie dann eine zugehörige Remotefunktion mit den gleichen Parametern, aber mit dem Rückgabetyp von HRESULT. Die lokale Funktion kann bei Bedarf eine Ausnahme basierend auf diesem HRESULT-Wert auslösen.
Das [object] -Attribut ist nicht verfügbar, wenn Sie mit dem MIDL-Compiler /osf-Schalter kompilieren.
Beispiele
[
uuid(12345678-1234-1234-1234-123456789ABC),
object
]
interface IMyInterface : IUnknown
{
// Interface definition statements.
}
[
uuid(87654321-1234-1234-1234-123456789ABC),
object,
local
]
interface ILocalInterface : ISomeOldCOMInterface
{
// Interface definition statements.
}
Weitere Informationen