Re: ATL com server can pass interface as parameters?
Hi! Igor,
Thank for your help.
My code is like following:
Server side
========
class CMy2 : IMy2
{
// IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(const IID& iid, void**
ppv) { return S_OK; }
ULONG STDMETHODCALLTYPE AddRef() { return 1; }
ULONG STDMETHODCALLTYPE Release() { return 1;
// IDispatch
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo){ return
S_OK; };
HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid,
ITypeInfo **ppTInfo){ return S_OK; };
HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR
*rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId){ return S_OK; };
HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
EXCEPINFO *pExcepInfo, UINT *puArgErr){ return S_OK; };
};
CMy2 csMy2;
STDMETHODIMP CMy1::GetInterface(IMy2 **pVal)
{
CMy2 *p = &csMy2;
*pVal = (IMy2 *)&p;
return S_OK;
}
Client Side:
========
CoInitialize(NULL);
IMy1 *pIMy1=NULL;
HRESULT hr;
hr=CoCreateInstance(CLSID_My1,NULL,CLSCTX_LOCAL_SERVER,IID_IMy1,
(void**)&pIMy1);
if (SUCCEEDED(hr))
{
IMy2 *pIMy2 = NULL;
hr = pIMy1->GetInterface(&pIMy2); <== Got
ERROR_NOACCESS
}
CoUninitialize();
idl
==
[
object,
uuid(F3045B8C-E474-4DFF-8AC6-90936FF3779E),
dual,
helpstring("IMy2 Interface"),
pointer_default(unique)
]
interface IMy2 : IDispatch
{
};
[
object,
uuid(F3045B8C-E474-4DFF-8AC6-90936FF3779B),
dual,
helpstring("IMy1 Interface"),
pointer_default(unique)
]
interface IMy1 : IDispatch
{
[id(1), helpstring("method GetInterface")] HRESULT
GetInterface([out,retval] IMy2 **pVal);
};
[
uuid(ED1706E6-25A8-4050-99A4-8349C9385CEC),
version(1.0),
helpstring("ComTest 1.0 Type Library")
]
library COMTESTLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(42829015-7E0E-4226-B6C0-1590DC89B3E9),
helpstring("My1 Class")
]
coclass My1
{
[default] interface IMy1;
};
};
If any improper, please correct me.
Thank you.
Ceasar