Содержание

Скачать: Версия: 1.0.0.2|Исходники (MS VC++ 6.0)

Разработчик: Александр Орефков

Описание

vkloader (далее ВК) - внешняя компонента для 1С-Предприятия 7.7, которая может загружаться без ее регистрации в реестре, и загружать другие внешние компоненты без их регистрации. Предназначена для беспроблемной загрузки внешних компонент пользователями, не имеющими прав на запись в HKCR ветку реестра.

Принцип работы основан на перехвате обращения 1С к WinAPI функциям CLSIDFromProgID и CoCreateInstance.

Также ВК решает проблему "зависания" процесса 1С в памяти при закрытии программы при использовании несовсем корректно написанных сторонних внешних компонент.

Использование

Для работы ВК необходимо загрузить ее в процедуре ПриНачалеРаботыСистемы.

Процедура ПриНачалеРаботыСистемы()
    ЗагрузитьВнешнююКомпоненту("vkloader.dll");

Благодаря некоторым хитростям, ВК загружается без всякой ее регистации в реестре, то есть всегда.

Для загрузки других внешних компонент без их регистрации в реестре, необходимо воспользоваться объектом ЗагрузчикВК. Сначала необходимо получить информацию о внешней компоненте, а именно ее ProgID, и CLSID. Для удобства получения этой информации существует сервисный метод КодЗагрузки. Когда эта информация (она всегда постоянна для каждой конкретной внешней компоненты независимо от компьютера и среды ее выполнения) получена, можно вдальнейшем загружать внешнюю компоненту методом ЗагрузитьВК.

Для примера работа с 1С++

Сначала один раз под пользователем с правами админа выполняем в любой базе следующий код:

ЗагрузитьВнешнююКомпоненту("vkloader.dll");
звк = СоздатьОбъект("ЗагрузчикВК");
Рез = звк.КодЗагрузки("1cpp.dll");
Если Рез.КодОшибки = 0 Тогда
    Сообщить(Рез.Результат);
Иначе
    Сообщить("Ошибка " + Рез.КодОшибки + РазделительСтрок + Рез.Результат);
КонецЕсли;

При успешном выполнении в окне сообщений выводится фрагмент програмного кода на языке 1С. Выделяем его и копируем.

Далее в "боевой" конфигурации в ПриНачалеРаботыСистемы заменяем:

ЗагрузитьВнешнююКомпоненту("1cpp.dll");

на:

ЗагрузитьВнешнююКомпоненту("vkloader.dll");

и вставляем код, скопированный ранее из окна сообщений:

Загрузчик = СоздатьОбъект("ЗагрузчикВК");
Результат = Загрузчик.ЗагрузитьВК("1cpp.dll", "Addin.1C++=fde5ae76-00b3-4bdb-921b-d5937997b1b7");

Сохраняем конфигурацию. Все. Теперь 1С++ будет загружаться на любой машине без регистрации ее в реестре.

Следует отметить, что после успешного выполнения ЗагрузитьВК, применение обычного метода ЗагрузитьВнешнююКомпоненту для этой ВК будет происходить также успешно. Например, во многих типовых ЗагрузитьВнешнююКомпоненту("v7plus.dll") встречается во многих местах, по месту необходимости. Достаточно в ПриНачалеРаботыСистемы загрузить ее загрузчиком, и штатный вызов ЗагрузитьВнешнююКомпоненту("v7plus.dll") также будет отрабатывать успешно.

Объекты

ЗагрузчикВК

(AddinLoader)

Предназначен для загрузки других внешних компонент и формирования кода их загрузки.

Создается с помощью СоздатьОбъект("ЗагрузчикВК");

Методы

КодЗагрузки

(GetLoadCode)

Синтаксис: КодЗагрузки(ПутьКФайлу);

Параметры:

  • ПутьКФайлу - строка. Путь к файлу внешней компоненты.

Возвращает: Объект РезультатВыполнения. При успешном вызове поле Результат содержит фрагмент програмного кода для загрузки указанной ВК, иначе - описание ошибки.

Описание: Формирует фрагмент програмного кода для загрузки ВК.

Это сервисный метод, избавляющий вас от необходимости ковырять файлы внешних компонент и реестр для выяснения их ProgID и CLSID. Его необходимо вызывать один раз администратором при вводе указанной внешней компоненты в эксплуатацию. Далее полученный код можно использовать для загрузки ВК обычными пользователями.

ЗагрузитьВК

(LoadAddin)

Синтаксис: ЗагрузитьВК(ПутьКФайлу, ИдентификаторыВК);

Параметры:

  • ПутьКФайлу - строка. Путь к файлу внешней компоненты.
  • ИдентификаторыВК - строка. Содержит соответствие ProgID объектов компоненты их CLSID. Проще всего получить эту строку с помощью метода КодЗагрузки.

Возвращает: Объект РезультатВыполнения. При успешном вызове поле Результат содержит список успешно загруженных объектов ВК, иначе - описание ошибки.

Описание: Загружает указанную внешнюю компоненту.

При этом при загрузке подменяется штатный механизм получения CLSID компоненты и создания ее объектов. Это гарантирует загрузку ВК при отсутствии прав на запись в HKCR ветку реестра, а также то, что будет выполнятся именно тот файл, который указан при вызове метода, а не последний указанный в реестре.

РезультатВыполнения

Объект предназначен для возврата результата выполнения методов объекта ЗагрузчикВК.

Свойства

КодОшибки

Доступ: Только чтение.

Тип: Число.

Описание: Содержит числовой код результата.

  • 0 - выполнено успешно
  • 1 - неправильный параметр
  • 2 - файловая ошибка
  • 3 - отсутствуют ProgIDs в компоненте.
  • 4 - Предупреждение. Не для всех объектов ВК удалось получить CLSID
  • 5 - не переданы параметры загрузки компоненты.
  • 6 - в компоненте не найдена функция DllGetClassObject

Результат

Доступ: Только чтение.

Тип: Строка.

Описание: В случае успеха содержит результат выполнения, иначе - описание ошибки.

Код загрузки нескольких распространенных ВК

v7plus.dll:

Загрузчик = СоздатьОбъект("ЗагрузчикВК");
Результат = Загрузчик.ЗагрузитьВК("v7plus.dll", "Addin.V7Mail=faa6ebe0-1069-11d4-a5ff-008048da0cd2
    |Addin.V7SysInfo=046d5520-2c8f-11d4-a62a-008048da0cd2
    |Addin.V7HttpReader=1e7bc440-1076-11d4-a635-004095e0ebd2
    |Addin.XMLParser=bb45ed80-1ad7-11d4-a635-004095e0ebd2
    |Addin.V7TextFile=921da8db-1e6f-4d61-8f49-a3127b799b19");

1cpp.dll:

Загрузчик = СоздатьОбъект("ЗагрузчикВК");
Результат = Загрузчик.ЗагрузитьВК("1cpp.dll", "Addin.1C++=fde5ae76-00b3-4bdb-921b-d5937997b1b7");

turbomd.dll:

Загрузчик = СоздатьОбъект("ЗагрузчикВК");
Результат = Загрузчик.ЗагрузитьВК("turbomd.dll", "Addin.TurboMD=dc04a720-7f85-11d8-9fcd-c4cb45b9fe08");

turbobl.dll:

Загрузчик = СоздатьОбъект("ЗагрузчикВК");
Результат = Загрузчик.ЗагрузитьВК("turbobl.dll", "Addin.TurboBL=9f959861-909f-11d7-8d5e-9acf313eb700");

formex.dll:

Загрузчик = СоздатьОбъект("ЗагрузчикВК");
Результат = Загрузчик.ЗагрузитьВК("formex.dll", "AddIn.FormEx=5142b2ce-c533-473f-8bb4-4385c47732c5");
1C:TOP-100