Передать в Com другой Com как параметр
Точнее даже не передать, а получить.
Передать, как параметр метода...
Точнее даже не передать, а получить.
IUnknown**
IUnknown**
Т.е. дальше через QueryInterface? Но он вроде при этом должен создать новый объект? :-(
Можно чуть поподробнее плз? Не очень понимаю, что куда :-(
{
...
LPMYCLASS pMyClass = new CMyClass();
...
}
HRESULT CMyClass::QueryInterface(REFIID riid,void** ppv)
{
if(riid == IID_IUnknown)
*ppv = (LPUNKNOWN) this;
else if(riid == IID_IDispatch)
*ppv = (LPDISPATCH) this;
else if(riid == IDD_IMyClass)
*ppv = (LPMYCLASS) this;
else
return E_NOINTERFACE;
AddRef();
return S_OK;
}
CClassFactory::CreateInstance(...)
{
...
LPMYCLASS pMyClass = new CMyClass();
...
}
Это я видел...
Может я сильно торможу, но всё равно не понимаю, как это может мне помочь передать в качестве параметра в метод другой com-объект.
Вроде действительно можно через IUnknown, но до конца пока не въехал...
Может есть какой линк на пример?
CoCreateInstance(ObjectClSid1,NULL,CLSCTX_ALL,IID_IMyClass1,(void**)&pMyClass1);
LPMYCLASS2 pMyClass2;
CoCreateInstance (ObjectClSid2,NULL,CLSCTX_ALL,IID_IMyClass2,(void**)&pMyClass2);
pMyClass2->SetCom(pMyClass1)
.....
HRESULT CMyClass2::SetCom(LPUNKNOWN* ppCom)
{
HRESULT hr;
LPMYCLASS1 pMyClass1;
if(!(hr=(*ppCom)->QueryInterface(IID_IMyClass1,(void**)&pMyClass1)))
{
pMyClass1->Release();
}
return hr;
}
.....
LPMYCLASS1 pMyClass1;
То, что надо!
Спасибо большое. Никак не мог найти....
LPMYCLASS1 pMyClass1;
CoCreateInstance(ObjectClSid1,NULL,CLSCTX_ALL,IID_IMyClass1,(void**)&pMyClass1);
LPMYCLASS2 pMyClass2;
CoCreateInstance (ObjectClSid2,NULL,CLSCTX_ALL,IID_IMyClass2,(void**)&pMyClass2);
pMyClass2->SetCom(pMyClass1)
.....
HRESULT CMyClass2::SetCom(LPUNKNOWN* ppCom)
{
HRESULT hr;
LPMYCLASS1 pMyClass1;
if(!(hr=(*ppCom)->QueryInterface(IID_IMyClass1,(void**)&pMyClass1)))
{
pMyClass1->Release();
}
return hr;
}
.....
а не проще ли так :
Object1.CoCreateInstance ( CLSID_IClass1 );
CComPtr<IClass2> Object2;
Object2.CoCreateInstance ( CLSID_IClass2 );
CComPtr<IUnknown> pUnkObject1;
Object1.QueryInterface( &pUnkObject1 );
Object2->SetObject1( pUnkObject1 );
STDMETHODIMP CClass2::SetObject1(IUnknown* pUnkObject1)
{
AFX_MANAGE_STATE(AfxGetAppModuleState());
CComPtr<IUnknown> UnkObject1;
UnkObject1.Attach( pUnkObject1 );
CComPtr<IClass1> Object1;
UnkObject1.QueryInterface( &Object1 );
Object1->any_method();
return S_OK;
}
юзайте интеллектуальные указатели. и жизнь станет проще.
а не проще ли так :
Может и проще :-)
Возник другой вопрос: Можно ли как-то указать тип передаваемого объекта? Вроде языки дипа дельфей и пр. как-то проверяют, то или не то передаётся.
Может и проще :-)
Возник другой вопрос: Можно ли как-то указать тип передаваемого объекта? Вроде языки дипа дельфей и пр. как-то проверяют, то или не то передаётся.
Вообщем то если память мне не изменяет это архитектурное ограничение COM. Если же переданный объект не поддереживает требуемый интерфейс то в моем примере программа упадет :) на строчке Object1->any_method(). Поэтому перед вызовом надо проверить : if ( Object1.p != NULL ).