Авторегистрация COM компоненты на C#

Регистрация COM  компоненты автоматически и под любым пользователем

Для авторегистрации компоненты задействована следующая логика:

Пытаемся зарегистрировать компоненту с помощью объета «WScript.Shell», по умолчанию система регистрирует компоненту в раздел  HKEY_LOCAL_MACHINE, поэтому если данный шаг выполнять не под администратором программа выдаст ошибку на нарушение доступа к реестру, если вдруг получили ошибку, то пытаемся сделать запись в другой раздел рестра в ветку «HKEY_CURRENT_USER».

При помощи дополнительных агруменов /regfile /codebase для утилиты RegAsm.exe получаем файл с информацией которая будет записана в реестр (.reg).

wshShell.Run(ПутьRegAsm + " " + """" + ПутьДоКомпоненты + """" + " /regfile /codebase", 0, true);

Основная задача подменить имена корневых разделов и сделать запись в реестр с помощью wshShell.RegWrite

Сам парсинг файла .reg будет с помощью процедуры ПолучитьСписокКомандРегистрации  c 2 агрументами МассивЗаписей — пустой масcив  и  ИмяФайла — путь до нашего .reg файла

&НаКлиенте
Процедура ПолучитьСписокКомандРегистрации(МассивЗаписей, ИмяФайла)

Перем Ключ, Параметр, ИмяПараметра, СчетчикПараметров;


ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла);

Строка = ЧтениеТекста.ПрочитатьСтроку();

Пока Строка <> Неопределено Цикл

Если Лев(Строка, 1) = "[" Тогда //ключ реестра

Если Ключ <> Неопределено И СчетчикПараметров = 0 Тогда //Ключ без параметров
ДанныеКлюча = Новый Соответствие;
ДанныеКлюча.Вставить(Ключ, "");
МассивЗаписей.Добавить(ДанныеКлюча);
КонецЕсли;

Ключ = Строка + "";
Ключ = СтрЗаменить(Ключ, "[", "");
Ключ = СтрЗаменить(Ключ, "]", "");
Ключ = СтрЗаменить(Ключ, "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USERSoftwareClasses");

СчетчикПараметров = 0;

ИначеЕсли Лев(Строка, 1) = "@" Тогда //параметр без имени

ДанныеКлюча = Новый Соответствие;

Параметр = Строка;
Параметр = СтрЗаменить(Параметр, "@=", "");
Параметр = СтрЗаменить(Параметр, """", "");

ДанныеКлюча.Вставить(Ключ, Параметр);
МассивЗаписей.Добавить(ДанныеКлюча);

СчетчикПараметров = СчетчикПараметров + 1;

ИначеЕсли Лев(Строка, 1) = """" Тогда //параметр с именем

ДанныеКлюча = Новый Соответствие;

Параметр = Строка;
Параметр = СтрЗаменить(Параметр, """", "");

РазделительПараметра = Найти(Параметр, "=");
ИмяПараметра = Лев(Параметр, РазделительПараметра - 1);
Параметр = Сред(Параметр, РазделительПараметра + 1, СтрДлина(Параметр) - РазделительПараметра);

ДанныеКлюча.Вставить(Ключ + ИмяПараметра, Параметр);
МассивЗаписей.Добавить(ДанныеКлюча);

СчетчикПараметров = СчетчикПараметров + 1;

КонецЕсли;

Строка = ЧтениеТекста.ПрочитатьСтроку();

КонецЦикла;

Если Ключ <> Неопределено И СчетчикПараметров = 0 Тогда //Ключ без параметров
ДанныеКлюча = Новый Соответствие;
ДанныеКлюча.Вставить(Ключ, "");
МассивЗаписей.Добавить(ДанныеКлюча);
КонецЕсли;

ЧтениеТекста.Закрыть();

КонецПроцедуры
 

Далее другой процедурой ЗаписатьВРеестр записываем полученные данные

&НаКлиенте
Процедура ЗаписатьВРеестр(wshShell, МассивЗаписей, ПробыватьПодАдминистратором = Ложь)

Для каждого Запись Из МассивЗаписей Цикл
Для каждого КлючИЗначение Из Запись Цикл
КлючРеестра = КлючИЗначение.Ключ;
Если ПробыватьПодАдминистратором Тогда
КлючРеестра = СтрЗаменить(КлючИЗначение.Ключ, "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE");
КонецЕсли;
wshShell.RegWrite(КлючРеестра, КлючИЗначение.Значение);
КонецЦикла;
КонецЦикла;

КонецПроцедуры
 

Также приложена обработка с примером работы данного механизма, протестировано на Windows 8 и Windows 10.

3 Comments

  1. PowerBoy

    Делал подобное на VB:

    http://infostart.ru/public/199775/

    Reply
  2. spec8s

    (1) PowerBoy, это немного не то, есть компоненты которые написаны на C++ и тд, они регистрируются через regsvr32, а здесь рассматривается регистрация .NET библиотеки

    Reply
  3. Zhilyakovdr

    При замене через реестр появляется ряд проблем и с сервером предприятия x64 такой фокус не прокатит

    Замена компоненты на нужную

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *