AtlMarshalPtrInProc
建立新的資料流物件,寫入至資料流 Proxy 的 CLSID,並透過將必要的資料封送處理指定的介面指標初始化 Proxy 至資料流。
重要
這個函式不能用於 Windows 執行階段執行的應用程式。
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream
);
參數
拒絕
[in] 要封送處理介面的指標。iid
[in] 封送處理介面的 GUID。ppStream
[out] IStream 介面的指標在進行封送處理的新資料流物件。
傳回值
標準的 HRESULT 值。
備註
MSHLFLAGS_TABLESTRONG 旗標設為,那麼指標才能封送處理成多個資料流。 指標也可以解除封送處理多次。
如果封送處理失敗,釋放資料流指標。
在 [AtlMarshalPtrInProc 處理序之物件的指標只能使用。
範例
//marshaling interface from one thread to another
//IStream ptr to hold serialized presentation of interface ptr
IStream* g_pStm;
//forward declaration
DWORD WINAPI ThreadProc(LPVOID lpParameter);
HRESULT WriteInterfacePtrToStream(IMyCircle *pCirc)
{
//marshal the interface ptr to another thread
//pCirc has to be pointer to actual object & not a proxy
HRESULT hr = AtlMarshalPtrInProc(pCirc, IID_IMyCircle, &g_pStm);
//m_dwThreadID is a DWORD holding thread ID of thread being created.
CreateThread(NULL, 0, ThreadProc, NULL, 0, &m_dwThreadID);
return hr;
}
DWORD WINAPI ThreadProc(LPVOID /*lpParameter*/)
{
// CoInitializeEx is per thread, so initialize COM on this thread
// (required by AtlUnmarshalPtr)
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (SUCCEEDED(hr))
{
IMyCircle* pCirc;
//unmarshal IMyCircle ptr from the stream
hr = AtlUnmarshalPtr(g_pStm, IID_IMyCircle, (IUnknown**)&pCirc);
// use IMyCircle ptr to call its methods
double center;
pCirc->get_XCenter(¢er);
//release the stream if no other thread requires it
//to unmarshal the IMyCircle interface pointer
hr = AtlFreeMarshalStream(g_pStm);
CoUninitialize();
}
return hr;
}
需求
Header: atlbase.h