Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передать в Com другой Com как параметр

1.6K
08 февраля 2006 года
Unexpected
137 / / 09.12.2002
Передать, как параметр метода...
Точнее даже не передать, а получить.
351
08 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Unexpected
Передать, как параметр метода...
Точнее даже не передать, а получить.



IUnknown**

1.6K
09 февраля 2006 года
Unexpected
137 / / 09.12.2002
Цитата:
Originally posted by PitxBull
IUnknown**

Т.е. дальше через QueryInterface? Но он вроде при этом должен создать новый объект? :-(
Можно чуть поподробнее плз? Не очень понимаю, что куда :-(

2.2K
09 февраля 2006 года
REFOT
181 / / 08.04.2005
CClassFactory::CreateInstance(...)
{
...
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;
}
1.6K
09 февраля 2006 года
Unexpected
137 / / 09.12.2002
Цитата:
Originally posted by REFOT
CClassFactory::CreateInstance(...)
{
...
LPMYCLASS pMyClass = new CMyClass();
...
}

Это я видел...
Может я сильно торможу, но всё равно не понимаю, как это может мне помочь передать в качестве параметра в метод другой com-объект.
Вроде действительно можно через IUnknown, но до конца пока не въехал...
Может есть какой линк на пример?

2.2K
09 февраля 2006 года
REFOT
181 / / 08.04.2005
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;
}
.....
1.6K
09 февраля 2006 года
Unexpected
137 / / 09.12.2002
Цитата:
Originally posted by REFOT
LPMYCLASS1 pMyClass1;

То, что надо!
Спасибо большое. Никак не мог найти....

351
10 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by REFOT
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;
}
.....



а не проще ли так :

Код:
CComPtr<IClass1> Object1;
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;
}

юзайте интеллектуальные указатели. и жизнь станет проще.
1.6K
13 февраля 2006 года
Unexpected
137 / / 09.12.2002
Цитата:
Originally posted by PitxBull
а не проще ли так :

Может и проще :-)
Возник другой вопрос: Можно ли как-то указать тип передаваемого объекта? Вроде языки дипа дельфей и пр. как-то проверяют, то или не то передаётся.

351
13 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Unexpected
Может и проще :-)
Возник другой вопрос: Можно ли как-то указать тип передаваемого объекта? Вроде языки дипа дельфей и пр. как-то проверяют, то или не то передаётся.



Вообщем то если память мне не изменяет это архитектурное ограничение COM. Если же переданный объект не поддереживает требуемый интерфейс то в моем примере программа упадет :) на строчке Object1->any_method(). Поэтому перед вызовом надо проверить : if ( Object1.p != NULL ).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог