Получение СОМ объектом таблицы значений из 1С
От: Kolhoznic  
Дата: 15.10.08 22:07
Оценка:
Много было написано про взаимодействие 1С(8.1) и Ком объектов даже на этом форуме. Перерыл кучу информации, наверное я чтото упускаю...


Существует таблица в 1С назовем ее "ТабличноеПоле1".
передаем ее в ком объект таким образом

Компонента = Новый COMОбъект("ХХХ");
  перм = Компонента.SendTable(ТабличноеПоле1);


Функция приема со стороны КОМ объекта

STDMETHODIMP ХХХ::SendTable(/*in*/VARIANT Table1C,/* out retval*/VARIANT* ResultOfOperation)
{
/* В Table1C приходит указатель на IDispatch*/

return S_OK;
}

Работа с переменными и строками проблемм не вызывает а вот с таблицей....
Как можно достать значения из передаваемой таблице ? Какие методы интерфейса вызвать? Подскажите ПЛС...
Re: Получение СОМ объектом таблицы значений из 1С
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.10.08 05:22
Оценка: 3 (1)
Здравствуйте, Kolhoznic, Вы писали:

K>STDMETHODIMP ХХХ::SendTable(/*in*/VARIANT Table1C,/* out retval*/VARIANT* ResultOfOperation)
K>{
K>/* В Table1C приходит указатель на IDispatch*/
K>return S_OK;
K>}

K>Работа с переменными и строками проблемм не вызывает а вот с таблицей....
K>Как можно достать значения из передаваемой таблице ? Какие методы интерфейса вызвать? Подскажите ПЛС...

Для этого есть класс CComDispatchDriver с методами GetProperty/PutProperty для работы со свойствами и Invoke0/Invoke1/Invoke2/InvokeN для работы с методами объекта:
if( (Table1C.vt & ~VT_BYREF) == VT_DISPATCH )
{
    CComDispatchDriver spTable( (Table1C.vt & VT_BYREF) ? *Table1C.ppdispVal : Table1C.pdispVal );
...
//Vi2-например:    CComVariant v;
//                 hr = spTable.GetProperty(DISPID_VALUE, &v);

Если уверен и знаешь интерфейс объекта, стоящий за IDispatch, запрашивай его и работай как с обычным интерфейсом:
if( (Table1C.vt & ~VT_BYREF) == VT_DISPATCH )
{
    CComQIPtr<ITable> spTable( (Table1C.vt & VT_BYREF) ? *Table1C.ppdispVal : Table1C.pdispVal );

//Vi2-например:    spTable->Item(...);
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Получение СОМ объектом таблицы значений из 1С
От: Kolhoznic  
Дата: 16.10.08 07:41
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Для этого есть класс CComDispatchDriver с методами GetProperty/PutProperty для работы со свойствами и Invoke0/Invoke1/Invoke2/InvokeN для работы с методами объекта:

Vi2>
Vi2>if( (Table1C.vt & ~VT_BYREF) == VT_DISPATCH )
Vi2>{
Vi2>    CComDispatchDriver spTable( (Table1C.vt & VT_BYREF) ? *Table1C.ppdispVal : Table1C.pdispVal );
Vi2>...
Vi2>//Vi2-например:    CComVariant v;
Vi2>//                 hr = spTable.GetProperty(DISPID_VALUE, &v);
Vi2>

Vi2>Если уверен и знаешь интерфейс объекта, стоящий за IDispatch, запрашивай его и работай как с обычным интерфейсом:
Vi2>
Vi2>if( (Table1C.vt & ~VT_BYREF) == VT_DISPATCH )
Vi2>{
Vi2>    CComQIPtr<ITable> spTable( (Table1C.vt & VT_BYREF) ? *Table1C.ppdispVal : Table1C.pdispVal );

Vi2>//Vi2-например:    spTable->Item(...);
Vi2>


Интерфейсы мне не известны попробуем получить их...


CComVariant v;
                   

    if( (Table1C.vt & ~VT_BYREF) == VT_DISPATCH )
    {
        CComDispatchDriver spTable( (Table1C.vt & VT_BYREF) ? *Table1C.ppdispVal : Table1C.pdispVal );
        if (FAILED(hr = spTable.GetProperty(DISPID_VALUE, &v)))
                       {
                          //Возникает ошибка 0х80020003 - DISP_E_MEMBERNOTFOUND
                       }
       }

Вот такая ситуация ....
Re[3]: Получение СОМ объектом таблицы значений из 1С
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.10.08 11:19
Оценка:
Здравствуйте, Kolhoznic, Вы писали:

K>Интерфейсы мне не известны попробуем получить их...

K>CComVariant v;

K>    if( (Table1C.vt & ~VT_BYREF) == VT_DISPATCH )
K>    {
K>        CComDispatchDriver spTable( (Table1C.vt & VT_BYREF) ? *Table1C.ppdispVal : Table1C.pdispVal );
K>        if (FAILED(hr = spTable.GetProperty(DISPID_VALUE, &v)))
K>                       {
K>                          //Возникает ошибка 0х80020003 - DISP_E_MEMBERNOTFOUND
K>                       }
K>       }

K>Вот такая ситуация ....

Я же писал "например", а нужно вызывать что-то реальное, иначе, действительно, будет такая ошибка
    if (FAILED(hr = spTable.GetPropertyByName(L"конкретное имя свойства", &v)))

Или вызывать метод. Причем можно вызывать или по имени метода, или по DISPID метода. Посмотри состав класса CComDispatchDriver.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Получение СОМ объектом таблицы значений из 1С
От: Kolhoznic  
Дата: 17.10.08 06:37
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Я же писал "например", а нужно вызывать что-то реальное, иначе, действительно, будет такая ошибка

Vi2>
Vi2>    if (FAILED(hr = spTable.GetPropertyByName(L"конкретное имя свойства", &v)))
Vi2>

Vi2>Или вызывать метод. Причем можно вызывать или по имени метода, или по DISPID метода. Посмотри состав класса CComDispatchDriver.


Спасибо большое .... все заработало 3 ночи почти без сна дают о себе знать....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.