Отказ от ответственности Журнал Заметки Галерея

Ошибка внешней компоненты 1С 8.2 [13.09.2013]

Началось все с того, что для некоторой организации пришла пора приобретать новый сервер. На старом был установлен Windows Server 2003 (x86), на новый планировался Windows Server 2008 x64 R2, это-то и увело процесс решения проблемы на некоторое время в сторону.

Так вот. Под Windows 2003 совместно с 1с8.2 трудилась самописанная на C++ внешняя компонента, которая что-то там принимала из сети по UDP/IP и отправляла. Как водится подключалась она с помощью конструкции ПодключитьВнешнююКомпоненту("my_net_app.Application") и исправно работала. Но вот на новом сервере наотрез отказалась работать. Причем, вместо того чтобы вызывать исключение, как бывает когда компонента не зарегистрирована в регистре, функция возвращала «Ложь».

Здесь стоит сказать, что осложняло проблему еще и то, что компонента была выполнена в виде исполняемого модуля (.exe), а не, как принято, в виде динамической библиотеки (.dll). По это причине использовать другой синтаксис для запуска, с указанием прямого пути к модулю внешней компоненты, было нельзя.

Сначала под подозрение попала особенность регистрации COM объектов в 64-битной ОС. Но COM объект нормально создавался из Visual Basic с помощью функции CreateObject, и после некоторых экспериментов стало ясно, что «восьмерка» тоже запускает внешний процесс подключаемой компоненты, но тут же выгружает его из памяти. Тогда-то и пришла мысль проверить, а все ли интерфейсы, которые используются для взаимодействия с внешней компонентой, зарегистрированы в регистре.

Оказалось, что из всех интерфейсов, которые должны использоваться при создании внешней компоненты, 1с8.2 при инсталляции регистрирует только IInitDone! IAsyncEvent и ILanguageExtender, которые, как минимум, нужны при создании внешней компоненты в регистре отсутствуют. Влияет ли это на загрузку .dll версий компонент я проверять не стал, хотя понятно, что, если dll загружается непосредственно в рабочий процесс «восьмерки», то есть возможность запросить интерфейс по GUID минуя обращение к регистру.

Исследования регистра старого сервера привели к тому, что была найдена dll-ка которая и регистрировала все эти интерфейсы. И находилась она в старой инсталяции 1с8.1. Регистрация ее с помощью regsvr32 сразу восстановила работоспособность компоненты. Однако ее аналога в 1с8.2 найти не удалось.

Поэтому, для тех у кого возникнут проблемы с подключением внешней компоненты по ProgID или как-то по другому, предлагаю попробовать зарегистрировать вот эту библиотеку addnmrs.dll. Высок шанс, что ситуация поправится.

 
Реклама

www.alvis.com.ua
Котлы, водонагреватели, радиаторы и все необходимое для их установки

m-t.com.ua
Плитка, сантехника, низкие цены

www.rdsrv.org
Программа для удаленного администрирования компьютеров

журнал - заметки - галерея Все материалы на сайте являются собственностью автора © kuzmin@it.kharkov.ua +380504010794