Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Определение возможного типа регистрации dll / 19 сообщений из 19, страница 1 из 1
08.12.2021, 16:08
    #40118437
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
Всем доброго дня,

есть функция в которой проходит регистрация различных DLL.
С диска считывается список файлов с расширением DLL и далее програма перебирает этот список.
В зависимости от заданного ключа программы производится регистрация в ветке HKEY_LOCAL_MACHINE (глобально) или для текущего пользователя в HKEY_CURRENT_USER.
При регистрации в HKEY_LOCAL_MACHINE программа проверяет наличие у dll экспортированной функции DllRegisterServer и вызывает её (при этом программа запущена под админом). При регистрации в HKEY_CURRENT_USER программа работает без прав администратора и единственная возможность передать параметры в регистрируемую dll и сказать что регистрация происходит локально это использовать DllInstall в регистрируемой dll. Поскольку DllInstall присутствует не во всех dll то после проверки наличия DllInstall при её отсутствии используется TRegSvr.exe с ключами /t /c /q (t- регистрация как TypeLib, c - для текущего пользователя и q - без вывода сообщений) если это TypeLib и с ключами /c /q если это Com если функция присутствует.
Проблема заключается в том, что встречаются и com dll без функции DllInstall и вызывая для них TRegSvr.exe /t /c /q мы заносим их в реестр просто как TypeLib. Вопрос, чем это грозит при условии что все dll находятся в папке из которой запускается программа?

И дополнительно, можно как то ещё определить что эту dll нужно регистрировать как com кроме как проверить наличие DllInstall?

п.з. по идее, если я правильно понимаю, запуск регистрации в ветку HKEY_CURRENT_USER для текущего пользователя, которая не требует прав администратора возможен только через вызов в регистриеруемой dll экспортированной функции DllInstall т.к. она единственная принимает параметры в которых можно передать что это регистрация на текущего пользователя. Либо нужно самому писать в реестр все записи которые необходимые при регистрации вытаскивая из PE dll требуемые IDs и прочие параметры. Поправьте меня пожалуйста если я где то неправ.

Спасибо.
...
Рейтинг: 0 / 0
08.12.2021, 16:15
    #40118438
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotunможно как то ещё определить что эту dll нужно регистрировать как com кроме как
проверить наличие DllInstall?

Спросить у её автора. Обычно библиотекам вообще никакая регистрация не нужна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.12.2021, 16:33
    #40118444
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotun
вытаскивая из PE dll требуемые IDs и прочие параметры
Чего? Какие PE и ID?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
function DllInstall(bInstall: WordBool; pszCmdLine: LPCWSTR): HResult; stdcall;
var
  SavePerUserVal: Boolean;
begin
  SavePerUserVal := ComServer.PerUserRegistration;
  if StrIComp(pszCmdLine, PWideChar('user')) = 0 then
    ComServer.PerUserRegistration := True
  else
    ComServer.PerUserRegistration := False;
  if (bInstall) then
  begin
    Result := DllRegisterServer();
    if Result = E_FAIL then
      DllUnregisterServer();
  end
  else
    Result := DllUnregisterServer();
  ComServer.PerUserRegistration := SavePerUserVal;
end;

function DllUnregisterServer: HResult;
begin
  Result := S_OK;
  try
    ComServer.UpdateRegistry(False);
  except
    Result := E_FAIL;
  end;
end;

procedure TComServer.UpdateRegistry(Register: Boolean);
begin
  if FTypeLib <> nil then
    if Register then
      RegisterTypeLibrary(FTypeLib, GetModuleFileName, PerUserRegistration)
    else
      UnregisterTypeLibrary(FTypeLib, PerUserRegistration);
  FRegister := Register;
  ComClassManager.ForEachFactory(Self, FactoryUpdateRegistry);
end;

procedure TComObjectFactory.UpdateRegistry(Register: Boolean);
const
  ThreadStrs: array[TThreadingModel] of string =
    ('', 'Apartment', 'Free', 'Both', 'Neutral');
var
  ClassID, ProgID, ServerKeyName, ShortFileName, RegPrefix: string;
  RootKey: HKEY;
begin
  if FInstancing = ciInternal then
    Exit;

  ComServer.GetRegRootAndPrefix(RootKey, RegPrefix);

  ClassID := GUIDToString(FClassID);
  ProgID := GetProgID;
  ServerKeyName := RegPrefix + 'CLSID\' + ClassID + '\' + FComServer.ServerKey;
  if Register then
  begin
    CreateRegKey(RegPrefix + 'CLSID\' + ClassID, '', Description, RootKey);
    ShortFileName := FComServer.ServerFileName;
    if AnsiPos(' ', ShortFileName) <> 0 then
      ShortFileName := ExtractShortPathName(ShortFileName);
    CreateRegKey(ServerKeyName, '', ShortFileName, RootKey);
    if (FThreadingModel <> tmSingle) and IsLibrary then
      CreateRegKey(ServerKeyName, 'ThreadingModel', ThreadStrs[FThreadingModel], RootKey);
    if ProgID <> '' then
    begin
      CreateRegKey(RegPrefix + ProgID, '', Description, RootKey);
      CreateRegKey(RegPrefix + ProgID + '\Clsid', '', ClassID, RootKey);
      CreateRegKey(RegPrefix + 'CLSID\' + ClassID + '\ProgID', '', ProgID, RootKey);
    end;
  end
  else
  begin
    if ProgID <> '' then
    begin
      DeleteRegKey(RegPrefix + 'CLSID\' + ClassID + '\ProgID', RootKey);
      DeleteRegKey(RegPrefix + ProgID + '\Clsid', RootKey);
      DeleteRegKey(RegPrefix + ProgID, RootKey);
    end;
    DeleteRegKey(ServerKeyName, RootKey);
    DeleteRegKey(RegPrefix + 'CLSID\' + ClassID, RootKey);
  end;
end;

Но часто в своих библиотеках я переопределяю TComObjectFactory.UpdateRegistry и заношу в произвольные ветки реестра необходимую мне информацию.

А когда-то вообще писал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
function DllRegisterServer: HResult;
begin
  Result := RegisterWizard(TRTWizard.IdentyString);
end;

function RegisterWizard(const AIdenty: String): HResult;
begin
  try
    with TRegistry.Create do
    try
      RootKey := CexpRootKey;
      if KeyExists(CBDSRegKey) and OpenKey(CBDSRegKey + CexpRegKey, True) then begin
        WriteString(AIdenty, SysUtils.GetModuleName(HInstance));
        CloseKey;
        Result := S_OK;
      end else begin
        MessageBox(0, 'Delphi ' + CDelphiVersion + ' not installed', nil, MB_OK or MB_ICONERROR);
        Result := E_ABORT;
      end;
    finally
      Free;
    end;
  except
    Result := E_UNEXPECTED
  end;
end;

И что вы собрались вытаскивать?
...
Рейтинг: 0 / 0
08.12.2021, 16:40
    #40118445
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
Dimitry Sibiryakov

hlopotunможно как то ещё определить что эту dll нужно регистрировать как com кроме как
проверить наличие DllInstall?

Спросить у её автора. Обычно библиотекам вообще никакая регистрация не нужна.

те dll которым регистрация нужна (которые пихают в реестр свои дополнительные параметры через DllRegisterServer при регистрации) я в принципе подправил, добавил DllInstall и логику выбора ветки регистрации через TComServerObject.PerUserRegistration и они регистрируются корректно и параметры пишутся в правильную ветку. Но количество остальных dll зашкаливает, поэтому те, где DllRegisterServer не переопределяется (значит ничего своего при регистрации в реестр не пишется) трогать не стал. Слишком много правок плюс перешли сейчас с cvs на gitlab хаоса хватает и без этих правок. Переварить бы это всё сначала а потом уж кардинально всё менять.

п.с. я в принципе склоняюсь тоже к тому что поскольку всё лежит в одной папке то должно работать, но хотелось бы по возможности сделать всё максимально правильно. Основная идея была избавить админов от ввода паролей на рабочих станциях при инсталляции клиентов. Сначала написал сервис который регистрировался на клиенте и работал под правами позволяющими регистрировать компоненты, и в принципе всё заработало но вылезли проблемы с правами в доменах при регистрации сервиса из сети на windows 8 (до тестирования на windows 7 не дошли поскольку время поджимало, решили переписать просто через регистрацию на пользователя). Вроде получилось проще чем с сервисом и надёжнее с точки зрения зоопарка компов у клиентов но работа ещё не окончена.
...
Рейтинг: 0 / 0
08.12.2021, 16:45
    #40118452
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotunкоторые пихают в реестр свои дополнительные параметры через DllRegisterServer
при регистрации

Ещё раз, медленно: это нужно только для работы совсем сторонних приложений чтобы
СОМ-объекты создавались по UUID или имени. Твоё приложение совсем не стороннее и
способно создавать объекты прямо вызывая Factory конкретной библиотеки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.12.2021, 16:46
    #40118453
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
_Vasilisk_

..........
И что вы собрались вытаскивать?


Я имел ввиду если писать в реестр внешней программой производящей регистрацию не вызывая встроенные в dll DllRegisterServer, DllInstall итп
...
Рейтинг: 0 / 0
08.12.2021, 16:48
    #40118455
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotunЯ имел ввиду если писать в реестр внешней программой производящей регистрацию не
вызывая встроенные в dll DllRegisterServer, DllInstall итп

Таких программ не существует в природе. RegSvr просто вызывает эти функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.12.2021, 16:51
    #40118458
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
Dimitry Sibiryakov

hlopotunЯ имел ввиду если писать в реестр внешней программой производящей регистрацию не
вызывая встроенные в dll DllRegisterServer, DllInstall итп

Таких программ не существует в природе. RegSvr просто вызывает эти функции.


да, об этом можно догадаться читая сообщения от tregsrv или от regsvr32.
...
Рейтинг: 0 / 0
08.12.2021, 17:00
    #40118462
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotunда, об этом можно догадаться

И что помешало тебе это сделать?..

hlopotunя в принципе подправил, добавил DllInstall и логику выбора ветки
регистрации

Если у тебя есть их исходники, которые ты можешь править, ты уже сто лет назад
мог их подключить прямо к проекту, избавившись от необходимости регистрации раз
и навсегда. Прокрастинуешь как обычно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.12.2021, 17:14
    #40118468
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
Dimitry Sibiryakov

..........
Твоё приложение совсем не стороннее и
способно создавать объекты прямо вызывая Factory конкретной библиотеки.


Прошу прощения за тупость/назойливость но хочу быть уверен:
и это происходит автоматически если библиотека лежит в одной папке с программой? Или это требует дополнительных манипуляций в коде при вызове/подключении?

п.с. если у кого то есть интересные ссылки где можно почитать об автоматизме при вызове библиотек поделитесь пожалуйста.
Вроде что нашел уже прочитал но чувство 100й уверенности не приходит :(
...
Рейтинг: 0 / 0
08.12.2021, 17:22
    #40118471
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
Dimitry Sibiryakov

hlopotunда, об этом можно догадаться

И что помешало тебе это сделать?..

hlopotunя в принципе подправил, добавил DllInstall и логику выбора ветки
регистрации

Если у тебя есть их исходники, которые ты можешь править, ты уже сто лет назад
мог их подключить прямо к проекту, избавившись от необходимости регистрации раз
и навсегда. Прокрастинуешь как обычно...


слишком много проектов построенных на этих dll, к 90% из которых никогда ренее не прикасался (не говоря уже о понимании их бизнес логики), просто утону .... да и правка каждого проекта влечёт привлечение ресурсов на тестирование , просто не переварим всё в отведённые сроки. Приходится искать компромиссы.
...
Рейтинг: 0 / 0
08.12.2021, 17:59
    #40118481
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotun

слишком много проектов построенных на этих dll, к 90% из которых никогда ренее не прикасался (не говоря уже о понимании их бизнес логики), просто утону .... да и правка каждого проекта влечёт привлечение ресурсов на тестирование , просто не переварим всё в отведённые сроки. Приходится искать компромиссы.


Регистрация dll - зло. Тебе уже сказали, что самим dll эта регистрация не нужна, достаточно положить её рядом к exe. После чего найти регистрацию этой dll в реестре, перейти по указанному пути (перестраховываюсь) и сделать regsvr32.exe /u shitlibname.dll
...
Рейтинг: 0 / 0
08.12.2021, 19:23
    #40118511
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
LocksmithPC,

не получится наверное, посмотрел в коде некоторых проектов, там всё через Result := CreateComObject (ClassID); т.е. через ClassID а это через реестр только.
...
Рейтинг: 0 / 0
08.12.2021, 19:35
    #40118514
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotun
LocksmithPC,

не получится наверное, посмотрел в коде некоторых проектов, там всё через Result := CreateComObject (ClassID); т.е. через ClassID а это через реестр только.


Откуда берется ClassID?
...
Рейтинг: 0 / 0
08.12.2021, 19:36
    #40118515
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
Search And Replace этих вызовов на прямое Result := ClassID.Create() -
совершенно непосильная задача для некоторых, понимаю... Извращаться уже полгода
с регистрацией гораздо проще, конечно же...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.12.2021, 19:53
    #40118519
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotun
Result := CreateComObject (ClassID);
Заменить на
Код: pascal
1.
OleCheck(DllGetClassObject(ClassID, IID, Result));

и никакой регистрации
...
Рейтинг: 0 / 0
09.12.2021, 12:01
    #40118585
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
_Vasilisk_
hlopotun
Result := CreateComObject (ClassID);
Заменить на
Код: pascal
1.
OleCheck(DllGetClassObject(ClassID, IID, Result));

и никакой регистрации


ну, с регистрацией пока всё получается. При таком количестве зависимых проектов кардинально менять логику опасно.
Иду по коду, при необходимости либы подправляю.
Последний затык был с FastMM4, при его наличии в uses regsvr32 вываливал что модуль не найден и загружен быть не может (причём без указания какой модуль). Посмотрел зависимости у dll, помимо прочих там ссылка на c:\windows\system32\FastMM_FullDebugMode.dll непонятно почему ругалось т.к. либа со всеми остальными системными лежит рядом в windows\system32. Убрал FastMM4 из зависимостей всё стало регистрироваться. Можно ещё попробовать прописать включение fullldebug mode только в режиме отладки. Непонятно только почему он блокировал загрузку dll при регистрации (даже при запуске из под админа). Но поскольку FastMM4 тут не критичен, пока просто его выпилил. Будет время разберёмся в чём причина.
...
Рейтинг: 0 / 0
09.12.2021, 12:59
    #40118597
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
hlopotun
ну, с регистрацией пока всё получается
Если все получается, то зачем плодить темы? Это уже пятая по счету?
hlopotun
либа со всеми остальными системными лежит рядом в windows\ system32 .
Дай угадаю - Windows 64 битная?
...
Рейтинг: 0 / 0
09.12.2021, 13:12
    #40118600
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение возможного типа регистрации dll
_Vasilisk_
hlopotun
ну, с регистрацией пока всё получается
Если все получается, то зачем плодить темы? Это уже пятая по счету?
hlopotun
либа со всеми остальными системными лежит рядом в windows\ system32 .
Дай угадаю - Windows 64 битная?


Спасибо за наводку! :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Определение возможного типа регистрации dll / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]