OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 19:50

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 13 Февраль, 2007 21:11 

Зарегистрирован: Среда, 07 Февраль, 2007 21:34
Сообщения: 3
Откуда: Нижний Новгород
В программе 1С можно подключать внешние компоненты по технологии COM хочу создать dll средствами BlackBox.
Пример на Delphi
описание интерфейсов
IInitDone = interface(IUnknown)
['{AB634001-F13D-11D0-A459-004095E1DAEA}']
function Init(pConnection: IDispatch): HResult; stdcall;
function Done: HResult; stdcall;
function GetInfo(var pInfo: PSafeArray): HResult; stdcall;
end;
и т.д.
реализация
AddInObject = class(TComObject, IDispatch, IInitDone, IlanguageExtender)
что означает в классе AddInObject реализацию всех этих интерфейсов.
BlackBox позволяет только один интерфейс реализовывать от предка
Как быть?
Создание компонент для 1С средствами BlackBox позволит обойтись без использования среды разработки типа Delphi которая, если быть честным, стоит денег.
Среда Lazarus хоть и бесплатна, но с технологией COM там плохо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 14 Февраль, 2007 02:14 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Просто пишется набор связанных типов - по одному на каждый интерфейс. Объекты этих типов ссылаются друг на друга и работают в связке. Пример - модуль ComObject, реализующий COM-объект для нескольких интерфейсов:
Код:
   TYPE
      IClassFactory = POINTER TO RECORD (WinOle.IClassFactory) END;
      
      Object = POINTER TO RECORD (COM.IUnknown)
         ioo: IOleObject;
         ido: IDataObject;
         ips: IPersistStorage;
         ics: WinOle.IOleClientSite;
         idah: WinOle.IDataAdviseHolder;
         ioah: WinOle.IOleAdviseHolder;
         isg: WinOle.IStorage;
         ism: WinOle.IStream;
         w, h: INTEGER
      END;
      IOleObject = POINTER TO RECORD (WinOle.IOleObject)
         obj: Object
      END;
      IDataObject = POINTER TO RECORD (WinOle.IDataObject)
         obj: Object
      END;
      IPersistStorage = POINTER TO RECORD (WinOle.IPersistStorage)
         obj: Object
      END;

Смотрите - Object ссылается на объекты - реализации дополнительных интерфейсов, а они в свою очередь имеют обратную ссылку на свой Object. (Ничего "некрасивого" в этом нет, т.к. инкапсуляция в Паскалях на уровне модуля, а не класса, и набор взаимодействующих типов ничем не хуже одного единственного).

Фабрика класса создает связку объектов - главный Object и вспомогательные:
Код:
   PROCEDURE (this: IClassFactory) CreateInstance (outer: COM.IUnknown; IN iid: COM.GUID;
                                                            OUT int: COM.IUnknown): COM.RESULT;
      VAR res: COM.RESULT; new: Object;
   BEGIN
      IF outer = NIL THEN
         NEW(new);
         IF new # NIL THEN
            NEW(new.ioo, new); NEW(new.ido, new); NEW(new.ips, new);
            IF (new.ioo # NIL) & (new.ido # NIL) & (new.ips # NIL) THEN
               new.ioo.obj := new;
               new.ido.obj := new;
               new.ips.obj := new;
               res := new.QueryInterface(iid, int)
            ELSE res := WinApi.E_OUTOFMEMORY
            END
         ELSE res := WinApi.E_OUTOFMEMORY
         END
      ELSE res := WinApi.CLASS_E_NOAGGREGATION
      END;
      RETURN res
   END CreateInstance;


А QueryInterface главного объекта отдает при запросах дополнительных интерфейсов указатели на вспомогательные объекты:

Код:
   PROCEDURE (this: Object) QueryInterface (IN iid: COM.GUID; OUT int: COM.IUnknown): COM.RESULT;
   BEGIN
      IF COM.QUERY(this, iid, int)
         OR COM.QUERY(this.ioo, iid, int)
         OR COM.QUERY(this.ido, iid, int)
         OR COM.QUERY(this.ips, iid, int) THEN RETURN WinApi.S_OK
      ELSE RETURN WinApi.E_NOINTERFACE
      END
   END QueryInterface;


Там среди примеров в подсистеме COM много чего есть... :-)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB