Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно зарегить плагин к 1С ? [D7, XP]


Страницы:   1 2

ANB ©   (2006-04-12 17:45:00) 

На основе заготовки MASTER и SAMPLE ничего не работало.
Взял SAMPLE2 (который ролики крутит), переделал для себя - работает.
Запустил на другом компе - не находит CLSID.
Все понятно - не зарегился COM сервер.
Снес у себя ветки в реестре - воспризвел ошибку.
Начал ломать кусочками.
Исправил GUID класса TAddInVideo - работает.
Снес проигрыватель и все, что его касается - работает.
Изменяю строку :
initialization
 TComObjectFactory.Create(ComServer, TAddInOfficeReport, Class_AddInOfficeReport,
   'AddInVideo', '', ciMultiInstance, tmApartment);
на на
 TComObjectFactory.Create(ComServer, TAddInOfficeReport, Class_AddInOfficeReport,
   'AddInMyPluggin', '', ciMultiInstance, tmApartment);
еще работает, но если после этого сменить GUID - вопит, что нет интерфейса IInitDone.
Меняю GUID, ставлю на место AddInVideo - снова все работает.
Вывод - где то ломаю регистрацию. Еще зачем то тащится форма AddInDoc, которая мне совсем не нужна (со своей регистрацией и TLB).

Кто знает - какие минимальные телодвижения нужно сделать, чтобы плагин в 1С нормально регистрился и загружался ?


tesseract   (2006-04-13 10:39:00) [21]

anb - мой
класс нужен. Там кое-что даже документировано :-)


> если по правилам, то ничего не надо, 1С сама умеет такие
> регистрить (только не помню функцию ;)


Из моей возможно будущей статьи :-)

Описание процессов, происходящих при загрузке компоненты

Загрузка компоненты :
ЗагрузитьВнешнююКомпонету - загружает и инициализирует компоненту из библиотеки
1 -  Регистрируется HKCR "имя сервера.Имя класса". Имя сервера указанное в ComServer.SetServerName.
    и предположительно должно быть AddIn. Имя  класса(ов)  - указанное в ID 100 ресурсов файла.
2 - Попытка создания  Com-объекта;
  -> Если ID 100 отсутсвует/ неправилен, вы получите "отсутсвует CLSID".
Регстрация компонеты закончена, начиная с этого шага можно использовать ПодключитьВнешнююКомпоненту
{создаётся оъект интерфейса iInitDone}
3 - Вызывается init(pConn:IDispatch).
    Происходит инициализация объекта, инициализация используемых интерфейсов.
    -> Вызовом RegisterProfileAs(const bstrProfileName: WideString) происходит регистрация ключа реестра, где храняться наши настройки.
    -> По умолчанию они -> Имя нашего модуля + '_profile'
    -> Происходит вызов метода moduleinit .
4 - Вызывается GetInfo(var pInfo: PSafeArray) - выяcняется версия OLE
{создаётся объект интефейса IlanguageExtender}
5 - Вызывается RegisterExtensionAs(var bstrExtensionName: WideString)
 Компонета регистрируется как "Имя класса" в 1с.
6 - Вызывается создание Com-объекта уже как "addin.Имя класса", проверяется возможность создания зарегистрированного объекта
 -> Если RegisterExtensionAs указан не тот объект, вы получите "отсутсвует CLSID".
{создаётся объект интерфеса ISpecifyPropertyPage }
7 - вызывается GetPages(out Pages: TCAGUID) (при использовании ISpecifyPropertyPage)
   выясняется наличие страниц свойств.
 -> При регистрации компоненты, как торгового оборудования, вы увидите сообщение о том, что страница свойств объекта доступна
 -> В меню "сервис" -> "параметры".

ПодключитьВнешнююКомпоненту("Addin.имя Класса")
 загружает и инициализирует компоненту с CLSID переданным, как параметр. Есть предположение, что ЗагрузитьВнешнююКомпоненту вызывает эту
 функцию начиная с шага 3.

 СоздатьОбъект("Addin.имя Класса")
 практически равносильно ЗагрузитьВнешнююКомпоненту.
  Но выполняются только шаги  2,3,5,7.

 Конец инициализации

 При выгрузке компоненты вызывается метод DONE.
 Вызывается он при закрытии обработке в которой использован СоздатьОбъект, и при закрытии 1с (ИМХО только если использован ILanguageExtender)
  -> вызывается ModuleDone.

 Вызов Функции/процедуры :
  Данная последовательность вызывается каждый раз при вызове процедуры!
  -> Из чего следует наличие почти полноценного "RTTI".

 1 - Вызов FindMethod(const bstrMethodName: WideString;  var plMethodNum: Integer) с именем метода.
   Метод может быть, как русским так и английским.
 2 - Вызов GetNParams(lMethodNum: Integer;  var plParams: Integer)
   Выяснение кол-ва аргументов процедуры/функции.
 3 - Вызов HasRetVal(lMethodNum: Integer;  var pboolRetValue: Integer)
   Выяснение - процедура или функция это у нас.
 4 - Вызов GetParamDefValue(lMethodNum, lParamNum: Integer;  var pvarParamDefValue: OleVariant);
    Функция вызывается, если в функцию передали меньше значений, чем вернула GetNParams.
    Функция вызывается по разу за каждый неуказанный параметр.
 5. CallAsFunc или CallAsProc соотвественно.

 Получение/запись свойства объекта
1. Вызов FindProp(const bstrPropName: WideString;  var plPropNum: Integer) с именем свойства.
   Метод может быть, как русским так и английским.
2. Если свойство присваивается, то вызывается    IsPropWritable(lPropNum: Integer;  var pboolPropWrite: Integer)
   -> Если свойство считывается, то НИЧЕГО не вызвается, прошу обратить внимание!!!!!
   -> Все свойства по умолчанию являются "Для чтения".
   -> Если вы хотите иметь его только для чтения в TcustomAddin  имеется заглушка на сей счёт.
3. Вызывается GetPropVal(lPropNum: Integer;  var pvarPropVal: OleVariant)
     или SetPropVal(lPropNum: Integer;  var varPropVal: OleVariant)

Работа с асинхронным событием
 1. Компонета вызовом ExternalEvent помещает событие в очередь ожидания
 2. Если в текущей (активной!) обработке/документе/отчёте модуле  присутсвует функция ОбработкаВнешнегоСобытия
    то ей передаётся управление.
 3. Выполянется интерпритация события


ANB   (2006-04-13 09:07:00) [22]


> скачай нормальный, сторонний пример, 1С-совские

Сейчас поищу в яндексе. И у наших поспрошаю.
У меня из родных 1С-ских примеров завелся только тот, что с роликами. Но стоит его чуток изменить - и он ломается.

Реестр я смотрел - регится класс по имени и гуиду, трешь ветки - все ломается.


sniknik   (2006-04-12 18:34:00) [23]

> при этом получать от 1С ссылку на ее экземпляр
просто не знаю, только по 1C-овски "парится"

> 1С не регистрит, она заружает плагин :
а по моему то же самое и делает, регистрит... (убрать все, "загрузить" и посмотреть в реестре...)

> ЗагрузитьВнешнююКомпоненту
LoadAddIn это она и есть, "по иностранному" ;)

> Если плохо регистряется - то потом ничего не работает.
значит чегото не так... скачай нормальный, сторонний пример, 1С-совские (с книжкой "технология создания внешних компонент") у меня ни один нормально не работал... во всех глюки какиенибудь да были. (на hare.ru (вроде), раньше неплохие лежали... сейчас сайт не открывается... почемуто, толи название подзабыл толи сайту каюк ;)


ANB   (2006-04-12 17:59:00) [24]

Если плохо регистряется - то потом ничего не работает.


ANB   (2006-04-12 17:58:00) [25]


> sniknik ©   (12.04.06 17:53) [1]

По правилам 1С. Действительно, очень мутно, но как сделать просто и при этом получать от 1С ссылку на ее экземпляр (в Init приезжает) ?
1С не регистрит, она заружает плагин :
ЗагрузитьВнешнююКомпоненту(Файл_Компоненты)
А компонента при этом должна сама регистряться.


sniknik   (2006-04-12 17:56:00) [26]

> только не помню функцию
может эти LoadAddIn и CreateObject (похожи ;)


sniknik   (2006-04-12 17:53:00) [27]

а он у тебя по правилам 1С (для 7ки там муторно както) или простой COM обьект?
если простой то regsvr32 AddInVideo.dll (ну или что у тебя за dll там получилась)

если по правилам, то ничего не надо, 1С сама умеет такие регистрить (только не помню функцию ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо