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

Ваш аккаунт

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

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

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

msvs 2008 vs примеры из книги Трельсена COM-ATL3

5.4K
21 июля 2010 года
cursor
114 / / 05.01.2008
Здравствуйте.
Осваиваю COM по книге Трельсена COM-ATL3. Там он пользуется vc++ 6, у меня - vs2008. Видимо из-за этого приходится всегда в примерах что-то исправлять, а тут я застрял.
Подошел к первому примеру COMa на ATL.
Создал класс визардом. Потом Трельсен пишет "а теперь давайте вручную добавим интерфейс" чтоб интересней было.
Сделал все по шагам. IDL файл компилируется без проблем, но сам проект - нет.
Код:
class ATL_NO_VTABLE CATLCoCar :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CATLCoCar, &CLSID_ATLCoCar>,
    public IDispatchImpl<ICreateCar, &IID_ICreateCar, &LIBID_ATLCarServerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CATLCoCar()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_ATLCOCAR)


BEGIN_COM_MAP(CATLCoCar)
    COM_INTERFACE_ENTRY(ICreateCar)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IStats) /// вот этот интерфейс
END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }
    void FinalRelease()
    {
    }
public:
};

В этом коде интерфейс IStats является тем самым добавленным вручную и невозможно откомпилировать код с COM_INTERFACE_ENTRY(IStats). Если эту строку закоментить, то все ок.
Ошибка такая:
 
Код:
Error   1   error C2440: 'static_cast' : cannot convert from 'CATLCoCar::_ComMapClass *' to 'IStats *'  d:\projects\other\atlcarserver\atlcarserver\atlcocar.h  32  ATLCarServer
Error   2   error C2440: 'initializing' : cannot convert from 'ATL::_ATL_CREATORARGFUNC (__stdcall *)' to 'DWORD_PTR'   d:\projects\other\atlcarserver\atlcarserver\atlcocar.h  32  ATLCarServer

Если кто сталкивался подскажите?
Мне кажется проблема тут где то
public IDispatchImpl<ICreateCar, &IID_ICreateCar, &LIBID_ATLCarServerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>.
Поставил аналогичную строчку
public IDispatchImpl<IStats, &IID_IStats, &LIBID_ATLCarServerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
но получил ошибку
 
Код:
Error   1   error C2594: 'static_cast' : ambiguous conversions from 'CATLCoCar::_ComMapClass *' to 'IDispatch *'    d:\projects\other\atlcarserver\atlcarserver\atlcocar.h  33  ATLCarServer

Уже ругающуюся на COM_INTERFACE_ENTRY(IDispatch)
upd.
удалить тему не знаю как. решилось тем, что просто закоментил COM_INTERFACE_ENTRY(IDispatch). Так и не понял че он там делал
14
21 июля 2010 года
Phodopus
3.3K / / 19.06.2008
а IStats то где вообще реализован?
Цитата: cursor
решилось тем, что просто закоментил COM_INTERFACE_ENTRY(IDispatch). Так и не понял че он там делал


мда, оригинально. Все же лучше сначала книжку целиком прочитать, а потом, с пониманием, реализовывать примеры.

5.4K
22 июля 2010 года
cursor
114 / / 05.01.2008
IStats объявлен в IDL:
 
Код:
interface IStats : IUnknown{
    [id(1), helpstring("method DisplayStats")] HRESULT DisplayStats(void);
    [id(2), helpstring("method GetPetName")] HRESULT GetPetName([out,retval] BSTR* petName);
};

и реализован в cpp файле класса.

Все работает и без той строки, что я закоментировал (COM_INTERFACE_ENTRY(IDispatch)). А примеры идут походу книги, как их не пробовать? Вот для чего там этот диспатч? И почему на нем та ошибка.
upd.
Блин, раскоментил эту строку - все заработало, в OLE viewer появился новый интерфейс... Че ж было то. Спасибо.
Просто в книге после того, как вручную добавили интерфейс написано "добавьте его в карту" и эта карта
 
Код:
BEGIN_COM_MAP(CATLCoCar)
COM_INTERFACE_ENTRY(ICreateCar)
CОM_INTERFACE_ENTRY (IStats)
END_COM_MAP ( )
без (!) диспатча
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог