Имя: Пароль:
1C
 
Работа с данными 1С из внешней компоненты Native API
0 Diabolicum 1C
 
21.10.10
10:58
Вопрос собственно в том, как осуществляется данное взаимодействие? Проштудировал и руководство по разработке ВК, и пример с ИТС. В общем разобрался и с классами и методами. Но нигде не сказано, как из внешней компоненты работать с 1С как с OLE automation server'ом.

В мануале указано только, что ссылка типа void*, передаваемая в метод Init ВК, является, по сути, ссылкой  IDispatch* и у нее есть свойство IDispatch* AppDispatch, являющееся ссылкой на COM интерфейс 1C:Предприятия. Однако уже на этапе получения данного свойства возникает либо ошибка стека (т.е. несоответствие соглашений о вызовах между описанием и реализацией по ссылке), либо просто падение 1С.

Код выглядит примерно так:
1. В объявлении описания класса добавлено новое свойство:
class .... { ... private: ... IDispatch* m_iOLEInterface; }

2. В метод Init добавлена строка:
init(void* Connection) {...
m_iOLEInterface = (IDispatch*)Connection;}


3. Во все перечисления добавлено соответствующее описание процедуры

4. В процедуре CallAsProc добавлен код
CallAsProc(...)
{
  ....
  switch(...) {  ....
  case eMetaName:
      {
      DISPID sProp;
      HRESULT hr;
      LPOLESTR sProp =  L"AppDispatch";

      hr = m_iOLEInterface->GetIDsOfNames(IID_NULL, &sProp, 1, 0, &dispid);
      }      
  }
}


Проект нормально компилируется. DLL подключается, однако при попытке вызова добавленного метода возникает runtime ошибка. Методом научного тыка выяснил, что ошибку вызывает строка:
hr = m_iOLEInterface->GetIDsOfNames(IID_NULL, &sProp, 1, 0, &dispid).

Подскажите, пожалуйста, в чем ошибка.
1 Diabolicum 1C
 
21.10.10
14:24
ап
2 supremum
 
21.10.10
14:27
(0) Смысл?
3 Diabolicum 1C
 
21.10.10
15:05
(2) Требование заказчика :(. NativeAPI - потому что нужно подключать и на сервере (nix'ы). Библиотека должна расширять некоторые сервисные возможности платформы. Необходимо читать метаданные конфигурации.
-----------------------------------------------------
П.С. По сути помочь можешь?
4 supremum
 
21.10.10
15:44
(3) По сути мы должны получается либо передавать метаданные в вызываемый метод ВК (что думаю правильнее), либо подключаться в ВК к 1С через COM-соединения (ИМХО)
5 DmitrO
 
21.10.10
16:05
[В мануале указано только, что ссылка типа void*, передаваемая в метод Init ВК, является, по сути, ссылкой  IDispatch*]
Если мы говорим о компонентах NativeAPI, то это не правда - нет такого в документации. В Init передается указатель на IAddInDefBase.

Из компонент NativeAPI невозможно работать с данными 1С.
6 DmitrO
 
21.10.10
16:09
(4) Передавать метаданные будет весьма трудно, т.к. передать можно только простые типы, а подключаться COM-соединением на *nix серверах не получится.
7 Diabolicum 1C
 
21.10.10
16:11
(5) Правда ваша. Пересмотрел мануал.
(6) И какой выход?
8 Diabolicum 1C
 
21.10.10
16:13
(6) В чем тогда смысл Native? Компоненты типа склонения писать?
9 supremum
 
21.10.10
16:41
(7) Web-сервисы как вариант заюзать
10 supremum
 
21.10.10
16:43
+(9) Тогда можно будет и от внешней компоненты отказаться и нормально передавать структуры и данные.
11 DmitrO
 
21.10.10
18:20
(7) Выход1: а ну его в задницу этот *nix и NativeAPI;
Выход2: выносить мозг сериализацией, например xml;

Обычно тем кто задачу знает полностью и выход всегда найти легче.

(8) Хороший вопрос, черт побери, тока не по адресу.. сам понимаешь. :)