![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно зарегить плагин к 1С ? [D7, XP]
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С сама умеет такие регистрить (только не помню функцию ;)