IMarshal::MarshalInterface
Writes into a
stream the data required to initialize a proxy object in some client process.
HRESULT MarshalInterface(
IStream *pStm, |
//Pointer to stream used for marshaling |
REFIID riid, |
//Reference to the identifier of the interface to be
marshaled |
void *pv, |
//Interface pointer to be marshaled |
DWORD dwDestContext, |
//Destination context |
void *pvDestContext, |
//Reserved for future use |
DWORD mshlflags |
//Reason for marshaling |
); |
|
Parameters
pStm
[in] Pointer
to the stream to be used during marshaling.
riid
[in]
Reference to the identifier of the interface to be marshaled. This interface
must be derived from the IUnknown
pv
[in] Pointer
to the interface pointer to be marshaled; can be NULL if the caller does not
have a pointer to the desired interface.
dwDestContext
[in]
Destination context where the specified interface is to be unmarshaled. Values
for dwDestContext come from the enumeration MSHCTX
pvDestContext
[in] Reserved
for future use; must be zero.
mshlflags
[in] Whether
the data to be marshaled is to be transmitted back to the client process the normal case or written to a global table, where it can be retrieved by multiple
clients. Valid values come from the MSHLFLAGS8DNAZK enumeration.
Return Values
The method
supports the standard return value E_FAIL, as well as the following:
S_OK
The interface
pointer was marshaled successfully.
E_NOINTERFACE
The specified
interface is not supported.
STG_E_MEDIUMFULL
The stream is
full.
Remarks
This method
is called indirectly, in a call to CoMarshalInterface
Notes to Callers
Normally,
rather than calling IMarshal::MarshalInterface directly, your marshaling
stub instead should call the CoMarshalInterface function, which contains
a call to this method. The stub makes this call to command an object to write
its marshaling data into a stream. The stub then either passes the marshaling
data back to the client process or writes it to a global table, where it can be
unmarshaled by multiple clients. The stub s call to CoMarshalInterface
is normally preceded by a call to CoGetMarshalSizeMax
You do not
explicitly call this method if you are:
Implementing existing COM
interfaces, or
Defining your own interfaces
using the Microsoft Interface Definition Language (MIDL).
In both
cases, the MIDL-generated stub automatically makes the call.
If you are
not using MIDL to define your own interface, your marshaling stub must call
this method, either directly or indirectly.Your stub implementation should call
MarshalInterface immediately after its previous call to IMarshal::GetMarshalSizeMax
If the caller
has a pointer to the interface to be marshaled, it should, as a matter of
efficiency, use the pv parameter to pass that pointer. In this way, an
implementation that may use such a pointer to determine the appropriate CLSID
for the proxy does not have to call IUnknown::QueryInterface
Notes to Implementers
Your
implementation of IMarshal::MarshalInterface must write to the stream
whatever data is needed to initialize the proxy on the receiving side. Such
data would include a reference to the interface to be marshaled, a MSHLFLAGS
value specifying whether the data should be returned to the client process
or written to a global table, and whatever is needed to connect to the object,
such as a named pipe, handle to a window, or pointer to an RPC channel.
Your
implementation should not assume that the stream is large enough to hold all
the data. Rather, it should gracefully handle a STG_E_MEDIUMFULL error. Just
before exiting, your implementation should position the seek pointer in the
stream immediately after the last byte of data written.
If the pv
parameter is NULL and your implementation needs an interface pointer, it can
call IUnknown::QueryInterface
To ensure
that your implementation of MarshalInterface continues to work properly
as new destination contexts are supported in the future, delegate marshaling to
COM s default implementation for all dwDestContext values that your
implementation does not handle. To delegate marshaling to COM s default
implementation, call the CoGetStandardMarshal._04TA helper function.
Using the MSHLFLAGS
enumeration, callers can specify whether an interface pointer is to be
marshaled back to a single client or written to a global table, where it can be
unmarshaled by multiple clients. You must make sure that your object can handle
calls from the multiple proxies that might be created from the same
initialization data.
See Also