OberonCore
https://forum.oberoncore.ru/

Реализация внешней компоненты для 1С
https://forum.oberoncore.ru/viewtopic.php?f=1&t=383
Страница 1 из 1

Автор:  zh [ Вторник, 13 Февраль, 2007 21:11 ]
Заголовок сообщения:  Реализация внешней компоненты для 1С

В программе 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 ]
Заголовок сообщения: 

Просто пишется набор связанных типов - по одному на каждый интерфейс. Объекты этих типов ссылаются друг на друга и работают в связке. Пример - модуль 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 много чего есть... :-)

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/