IMarshal::GetUnmarshalClass-Methode (objidl.h)

Ruft die CLSID des entmarshaling-Codes ab.

Syntax

HRESULT GetUnmarshalClass(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] CLSID  *pCid
);

Parameter

[in] riid

Ein Verweis auf den Bezeichner der schnittstelle, die gemarshallt werden soll.

[in] pv

Ein Zeiger auf die zu marshallende Schnittstelle; kann NULL sein, wenn der Aufrufer keinen Zeiger auf die gewünschte Schnittstelle hat.

[in] dwDestContext

Der Zielkontext, in dem die angegebene Schnittstelle entmarshaliert werden soll. Mögliche Werte stammen aus der Enumeration MSHCTX. Die Entmarshaling kann entweder in einer anderen Wohnung des aktuellen Prozesses (MSHCTX_INPROC) oder in einem anderen Prozess auf demselben Computer wie der aktuelle Prozess (MSHCTX_LOCAL) auftreten.

[in] pvDestContext

Dieser Parameter ist reserviert und muss NULL sein.

[in] mshlflags

Gibt an, ob die zu marshallende Daten zurück an den Clientprozess (typischer Fall) übertragen oder in eine globale Tabelle geschrieben werden sollen, wo sie von mehreren Clients abgerufen werden können. Mögliche Werte stammen aus der MSHLFLAGS-Enumeration .

[out] pCid

Ein Zeiger, der die CLSID empfängt, die zum Erstellen eines Proxys im Clientprozess verwendet werden soll.

Rückgabewert

Wenn die Methode erfolgreich ist, wird der Rückgabewert S_OK. Andernfalls ist es S_FALSE.

Hinweise

Diese Methode wird indirekt aufgerufen, in einem Aufruf von CoMarshalInterface, durch den Code im Serverprozess, der für das Marshallen eines Zeigers auf eine Schnittstelle für ein Objekt verantwortlich ist. Dieser Marshallingcode ist in der Regel ein stub, der von COM für eine von mehreren Schnittstellen generiert wird, die einen Zeiger auf eine Schnittstelle marshallen kann, die in einem völlig anderen Objekt implementiert ist. Beispiele hierfür sind die Schnittstellen IClassFactory und IOleItemContainer . Zu Diskussionszwecken wird der Code, der für das Marshallen eines Zeigers verantwortlich ist, als Marshalling-Stub bezeichnet.

Um einen Proxy für ein Objekt zu erstellen, benötigt COM zwei Informationen aus dem ursprünglichen Objekt: die Menge der Daten, die in den Marshallingstream geschrieben werden soll, und die CLSID des Proxys.

Der Marshallingstub erhält diese beiden Informationen mit aufeinander folgenden Aufrufen von CoGetMarshalSizeMax und CoMarshalInterface.

Hinweise für Anrufer

Der Marshallingstub ruft die Implementierung dieser Methode des Objekts auf, um die CLSID abzurufen, die beim Erstellen einer instance des Proxys verwendet werden soll. Beim Empfang der CLSID lädt der Client die dll, die in der Systemregistrierung aufgeführt ist.

Sie rufen diese Methode nicht explizit auf, wenn Sie vorhandene COM-Schnittstellen implementieren oder die Microsoft Interface Definition Language (MIDL) verwenden, um Ihre eigenen Schnittstellen zu definieren. In beiden Fällen führt der Stub den Anruf automatisch aus. Weitere Informationen finden Sie unter Definieren von COM-Schnittstellen.

Wenn Sie midl nicht verwenden, um Ihre eigene Schnittstelle zu definieren, muss Ihr Stub diese Methode entweder direkt oder indirekt aufrufen, um die CLSID abzurufen, die die clientseitige COM-Bibliothek benötigt, um einen Proxy für das Objekt zu erstellen, das die Schnittstelle implementiert.

Wenn der Aufrufer über einen Zeiger auf die zu marshallende Schnittstelle verfügt, sollte er aus Effizienzgründen den pv-Parameter verwenden, um diesen Zeiger zu übergeben. Auf diese Weise muss eine Implementierung, die einen solchen Zeiger verwenden kann, um die entsprechende CLSID für den Proxy zu bestimmen, nicht QueryInterface für sich selbst aufrufen. Wenn ein Aufrufer keinen Zeiger auf die zu marshallende Schnittstelle hat, kann er NULL übergeben.

Hinweise für Implementierer

COM ruft GetUnmarshalClass auf, um die CLSID abzurufen, die zum Erstellen eines Proxys im Clientprozess verwendet werden soll. Die CLSID, die für einen Proxy verwendet werden soll, ist normalerweise nicht die des ursprünglichen Objekts, sondern eine, die Sie (mit dem Guidgen.exe-Tool) speziell für Ihr Proxyobjekt generiert haben.

Implementieren Sie diese Methode für jedes Objekt, das Marshalling für eine oder mehrere seiner Schnittstellen bereitstellt. Der Code, der für das Marshallen des Objekts verantwortlich ist, schreibt die CLSID zusammen mit den Marshallingdaten in einen Stream. COM extrahiert die CLSID und die Daten aus dem Datenstrom auf der Empfangenden Seite.

Wenn Ihre Proxyimplementierung einfach darin besteht, das gesamte ursprüngliche Objekt in den Clientprozess zu kopieren, wodurch keine Aufrufe an das ursprüngliche Objekt weitergeleitet werden müssen, wäre die zurückgegebene CLSID identisch mit der des ursprünglichen Objekts. Diese Strategie ist natürlich nur für Objekte ratsam, von denen keine Änderung erwartet wird.

Wenn der pv-ParameterNULL ist und Ihre Implementierung einen Schnittstellenzeiger benötigt, kann queryInterface für das aktuelle Objekt aufgerufen werden, um es abzurufen. Der pv-Parameter dient lediglich zur Verbesserung der Effizienz.

Um sicherzustellen, dass Ihre Implementierung von GetUnmarshalClass weiterhin ordnungsgemäß funktioniert, da neue Zielkontexte in Zukunft unterstützt werden, delegieren Sie marshalling an die COM-Standardimplementierung für alle dwDestContext-Werte , die ihre Implementierung nicht verarbeitet. Um marshalling an die COM-Standardimplementierung zu delegieren, rufen Sie die Funktion CoGetStandardMarshal auf.

Hinweis Der ThreadingModel-Registrierungswert muss für einen Prozessserver, der die von der GetUnmarshalClass-Methode zurückgegebene CLSID implementiert, auf Both festgelegt sein. Weitere Informationen finden Sie unter InprocServer32.
 

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000 Professional [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile objidl.h

Weitere Informationen

CoMarshalInterface

IMarshal