C клиент with ActiveX control
От: Vasilich2000  
Дата: 23.06.08 22:40
Оценка:
есть ActiveX control
использую #import и в *.tlh нахожу только Dispatch интерфейсы

struct __declspec(uuid("7adcdc5c-d0b6-11d1-aa76-002078136998"))
_DAcquisition : IDispatch
{
    // Methods:
    HRESULT ShowHomePage (
        VARIANT_BOOL Visibility );
    ...
}


соответвенно в *.tli ипользуется метод _com_dispatch_method, например
inline long _DAcquisition::CheckDiskSpace ( _bstr_t SequencePathName, long * BytesSpaceFree, short RowToCheck ) {
    long _result = 0;
    _com_dispatch_method(this, 0x7, DISPATCH_METHOD, VT_I4, (void*)&_result, 
        L"\x0008\x4003\x0002", (BSTR)SequencePathName, BytesSpaceFree, RowToCheck);
    return _result;
}


с своем коде создаю Instance, но вызов любого метода приводит к ошибки UnExpected

    if( pCOMLTQAcquisition.CreateInstance(  L"ACQUISITION.AcquisitionCtrl.1") != S_OK)
        throw ::CString( "Error: Failed to create LTQ ACQU0ISITION object.");
    _bstr_t ddd( "C:\\Xcalibur\\examples\\methods\\steroid.sld");
    long lDiskSpace;
    pCOMLTQAcquisition->CheckDiskSpace( ddd, &lDiskSpace, 1);


Если вставить этот ActiveX в диалог, то все работает.
OLEView дает
        [id(0x00000007)]
        long CheckDiskSpace(
                        BSTR SequencePathName, 
                        long* BytesSpaceFree, 
                        short RowToCheck);


И в чем зарыта собака?
Re: C клиент with ActiveX control
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.06.08 05:37
Оценка: +1 -1
Здравствуйте, Vasilich2000, Вы писали:

V>есть ActiveX control

V>...
V>с своем коде создаю Instance, но вызов любого метода приводит к ошибки UnExpected
V>...
V>Если вставить этот ActiveX в диалог, то все работает.
V>...
V>И в чем зарыта собака?

В том, что контрол нельзя использовать как простой СОМ объект (или ActiveX). Его нужно использовать как контрол — сделать некоторые инициализирующие манипуляции с его интерфейсами. До этого контрол имеет право выдавать E_UNEXPECTED в ответ на вызов других методов.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: C клиент with ActiveX control
От: Vasilich2000  
Дата: 24.06.08 06:30
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Vasilich2000, Вы писали:


V>>есть ActiveX control

V>>...
V>>с своем коде создаю Instance, но вызов любого метода приводит к ошибки UnExpected
V>>...
V>>Если вставить этот ActiveX в диалог, то все работает.
V>>...
V>>И в чем зарыта собака?

Vi2>В том, что контрол нельзя использовать как простой СОМ объект (или ActiveX). Его нужно использовать как контрол — сделать некоторые инициализирующие манипуляции с его интерфейсами. До этого контрол имеет право выдавать E_UNEXPECTED в ответ на вызов других методов.



а можно пример указать?
Re[3]: C клиент with ActiveX control
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.06.08 11:32
Оценка: -1
Здравствуйте, Vasilich2000, Вы писали:

V>а можно пример указать?


Какой?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: C клиент with ActiveX control
От: Vasilich2000  
Дата: 24.06.08 18:26
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Vasilich2000, Вы писали:


V>>а можно пример указать?


Vi2>Какой?


как сделать это
"некоторые инициализирующие манипуляции с его интерфейсами"
ну хотя бы на функции которые надо использовать для инициализации.
я нашел пример в инете и ничего не вижу нового http://www.tenouk.com/visualcplusmfc/visualcplusmfc24.html
Re[5]: C клиент with ActiveX control
От: Vi2 Удмуртия http://www.adem.ru
Дата: 25.06.08 03:36
Оценка:
Здравствуйте, Vasilich2000, Вы писали:

V>как сделать это "некоторые инициализирующие манипуляции с его интерфейсами"

V>ну хотя бы на функции которые надо использовать для инициализации.

Ты же сам написал, что "Если вставить этот ActiveX в диалог, то все работает". Вот и смотри, как там осуществляется инициализация контрола. Я тебе ответил, в чем зарыта собака.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: C клиент with ActiveX control
От: Vasilich2000  
Дата: 25.06.08 22:43
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Vasilich2000, Вы писали:


V>>как сделать это "некоторые инициализирующие манипуляции с его интерфейсами"

V>>ну хотя бы на функции которые надо использовать для инициализации.

Vi2>Ты же сам написал, что "Если вставить этот ActiveX в диалог, то все работает". Вот и смотри, как там осуществляется инициализация контрола. Я тебе ответил, в чем зарыта собака.


создается класс с помощью визарда

class CAcquisition : public CWnd{
protected:
    DECLARE_DYNCREATE(CAcquisition)
public:
    CLSID const& GetClsid()
    {
        static CLSID const clsid
            = { 0x7adcdc5e, 0xd0b6, 0x11d1, { 0xaa, 0x76, 0x0, 0x20, 0x78, 0x13, 0x69, 0x98 } };
        return clsid;
    }
    virtual BOOL Create(LPCTSTR lpszClassName,
        LPCTSTR lpszWindowName, DWORD dwStyle,
        const RECT& rect,
        CWnd* pParentWnd, UINT nID,
        CCreateContext* pContext = NULL)
    { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }
...
    long CheckDiskSpace(LPCTSTR SequencePathName, long* BytesSpaceFree, short RowToCheck);
...


long CAcquisition::CheckDiskSpace(LPCTSTR SequencePathName, long* BytesSpaceFree, short RowToCheck)
{
    long result;
    static BYTE parms[] =
        VTS_BSTR VTS_PI4 VTS_I2;
    InvokeHelper(0x7, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
        SequencePathName, BytesSpaceFree, RowToCheck);
    return result;
}


в диалоговом классе
          //header
    CAcquisition    m_OCX;
          //c++
    DDX_Control(pDX, IDC_ACQUISITIONCTRL1, m_OCX);
          ...
    long Space;
    SCODE Result = m_OCX.CheckDiskSpace(m_SequenceName,  &Space, m_StartRow);


и где здесь инициализация дополнительная?
единственное что-то хоть как-то подходящее, так это это в свойствах ACQUISITIONCTRL1 есть свойство Disabled = false

Vita, ты можешь поконкретнее указать, а не говорить загадками
Re[7]: C клиент with ActiveX control
От: bnk СССР http://unmanagedvisio.com/
Дата: 26.06.08 04:30
Оценка:
Здравствуйте, Vasilich2000, Вы писали:

V>и где здесь инициализация дополнительная?

V>единственное что-то хоть как-то подходящее, так это это в свойствах ACQUISITIONCTRL1 есть свойство Disabled = false

Там вся инициализация делается средствами MFC. Ее не видно, но она есть (c)
(зарыта внутри DDX_Control и CreateControl).

V>Vita, ты можешь поконкретнее указать, а не говорить загадками


здесь
Автор: LuciferMoscow
Дата: 15.11.06
?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.