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/ |