Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Создание коллекции с использованием ATL!


Автор: vovik4385 12.11.2013, 09:21
Здравствуйте столкнулся с такой проблемой:
Создал я СОМ сервер на с++ и клиент на VB вроде все работает!но только при нажатии кнопки DRAW в клиенте выдается ошибка runtime error 5 invalid procedure call or argument!но что самое интересное в среде разработки VB кнопка работает, в чем может быть причина? 

Автор: xvr 12.11.2013, 14:02
Судя по вот этому -
Код

STDMETHODIMP CSquiggleCollection2::Item(VARIANT index, VARIANT *pItem)
{
    // Be sure we have a long.
    if(index.vt == VT_I2)
    {        
...
    }

    return E_INVALIDARG;
}
у вас в строке if(index.vt == VT_I2) тип варианта оказался не I2 (это кстати не long, а short). И метод Item вернул INVALIDARG, что вы и получили в сообющении от VB.

Опишите ваш индекс в BetterSquiggleCollection.idl как Long а не VARIANT, система сама вам приведет тип к целому, и сама обругается, если это не получится


Автор: vovik4385 12.11.2013, 18:22
c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1827) : error C2259: 'CComObject<class CSquiggleCollection2>' : cannot instantiate abstract class due to following members:
        c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1823) : while compiling class-template member function 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CSquiggleCollection2> >::CreateInstance(void *,const struc
t _GUID &,void ** )'
c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1827) : warning C4259: 'long __stdcall ISquiggleCollection2::Item(long,struct tagVARIANT *)' : pure virtual function was not defined
        e:\òðåëüñåí ý. - ìîäåëü com è ïðèìåíåíèå atl 3.0\samples\chapter 11\squiggle collection 2\bettersquigglecollection.h(98) : see declaration of 'Item'
        c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1823) : while compiling class-template member function 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CSquiggleCollection2> >::CreateInstance(void *,const struc
t _GUID &,void ** )'
c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1827) : error C2259: 'CComObject<class CSquiggleCollection2>' : cannot instantiate abstract class due to following members:
        c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1823) : while compiling class-template member function 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CSquiggleCollection2> >::CreateInstance(void *,const struc
t _GUID &,void ** )'
c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1827) : warning C4259: 'long __stdcall ISquiggleCollection2::Item(long,struct tagVARIANT *)' : pure virtual function was not defined
        e:\òðåëüñåí ý. - ìîäåëü com è ïðèìåíåíèå atl 3.0\samples\chapter 11\squiggle collection 2\bettersquigglecollection.h(98) : see declaration of 'Item'
        c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1823) : while compiling class-template member function 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CSquiggleCollection2> >::CreateInstance(void *,const struc
t _GUID &,void ** )'


вот ято мне компилятор выдал!!!

Автор: vovik4385 12.11.2013, 21:04
Мне кажется дело не в этом(так как тогда бы и другие кнопки не работали бы ) а то не работает только одна кнопка DRAW?

Автор: xvr 12.11.2013, 21:08
Цитата(vovik4385 @  12.11.2013,  18:22 Найти цитируемый пост)
вот ято мне компилятор выдал!!! 
Правильно выдал - где функция  'long __stdcall ISquiggleCollection2::Item(long,struct tagVARIANT *)'? У вас теперь параметр не VARIANT* а long

Цитата(vovik4385 @  12.11.2013,  21:04 Найти цитируемый пост)
Мне кажется дело не в этом(так как тогда бы и другие кнопки не работали бы ) а то не работает только одна кнопка DRAW? 

У других кнопок вызов Item другой (или вообще нет), вот они и работают

Отладчиком не пробовали смотреть, как ваш код себя ведет? Очень помогает  smile 

Автор: vovik4385 12.11.2013, 21:34
xvr, не могли бы вы попробывать запустить?

Автор: xvr 13.11.2013, 14:19
Запустил, у меня все работает.

Поменял тип параметра на LONG - опять все работает:

IDL file:
Код

        [id(DISPID_VALUE), helpstring("method Item")] 
        HRESULT Item([in] LONG index, [out, retval] VARIANT* pItem);


SquiggleCollection2.h (строка 72)
Код

    STDMETHOD(Item)(/*[in]*/ long index, /*[out, retval]*/ VARIANT* pItem);


SquiggleCollection2.cpp (специально не стирал, а закоментарил лишнее)
Код

STDMETHODIMP CSquiggleCollection2::Item(/*VARIANT*/ long index, VARIANT *pItem)
{
    // Be sure we have a long.
//    if(index.vt == VT_I2)
    {        
        // Be sure we are in range.
        if(index /*.lVal*/ >=0 && index /*.lVal*/ <= m_vecSquiggles.size())
        {
            // Find the correct squiggle.
            IDispatch* pDisp = m_vecSquiggles[index /*.lVal*/ ];
            
            // Add the ref!
            pDisp->AddRef();
            
            // Set the type of VARIANT and return
            pItem->vt = VT_DISPATCH;
            pItem->pdispVal = pDisp;
            return S_OK;
        }
    }

    return E_INVALIDARG;
}

Автор: vovik4385 13.11.2013, 18:10
А в чем тогда причина может быть?

Автор: vovik4385 13.11.2013, 18:10
А в чем тогда причина может быть?

Автор: vovik4385 13.11.2013, 20:29
после того как я исправил код, ТЕПЕРЬ ОШИБКА при нажатии кнопки DRAW что обнаружена ошибка и приложение будет закрыто извините за неудобства? и при отладке ошибка доступа?

Автор: vovik4385 13.11.2013, 21:05
отладил выдает ошибку (KERNELBASE.DLL) 0xC00000F float inexact result!!Как можно решить эту проблему?

Автор: xvr 14.11.2013, 10:37
Запустите ваш COM сервер под отладчиком:
  • Включите Debug режим при сборке
  • В свойствах проекта на странице Debug введите имя вашего VB пускача в параметр Command
  • Запустите ваш проект под дебагером (F5)

Автор: vovik4385 14.11.2013, 17:55
я запускал под отладчиком, отладил выдает ошибку (KERNELBASE.DLL) 0xC00000F float inexact result

Добавлено через 7 минут и 58 секунд
как можно решить эту проблему?

Автор: xvr 14.11.2013, 21:24
Цитата(vovik4385 @  14.11.2013,  17:55 Найти цитируемый пост)
я запускал под отладчиком, отладил выдает ошибку (KERNELBASE.DLL) 0xC00000F float inexact result

Где именно выдает? Он должен показать строку в вашем коде.

Автор: vovik4385 15.11.2013, 05:44
первая строчка в функции item?

Автор: xvr 15.11.2013, 14:07
Смотрите переменные. Для начала - this, потом m_vecSquiggles

Вы вообще отладчиком пользоваться умеете? Без этого заниматься разработкой программ нереально  smile 

Автор: vovik4385 15.11.2013, 16:53
не очень!!!

Автор: xvr 16.11.2013, 17:32
Цитата(vovik4385 @ 15.11.2013,  16:53)
не очень!!!

Тогда учитесь - вот http://msdn.microsoft.com/ru-ru/library/sc65sadd.aspx например расписано подробно


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)