powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Определение возможного типа регистрации dll
19 сообщений из 19, страница 1 из 1
Определение возможного типа регистрации dll
    #40118437
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня,

есть функция в которой проходит регистрация различных 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
Определение возможного типа регистрации dll
    #40118438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunможно как то ещё определить что эту dll нужно регистрировать как com кроме как
проверить наличие DllInstall?

Спросить у её автора. Обычно библиотекам вообще никакая регистрация не нужна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Определение возможного типа регистрации dll
    #40118444
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Определение возможного типа регистрации dll
    #40118445
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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


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

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


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

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

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


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

и никакой регистрации
...
Рейтинг: 0 / 0
Определение возможного типа регистрации dll
    #40118585
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
Определение возможного типа регистрации dll
    #40118597
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
ну, с регистрацией пока всё получается
Если все получается, то зачем плодить темы? Это уже пятая по счету?
hlopotun
либа со всеми остальными системными лежит рядом в windows\ system32 .
Дай угадаю - Windows 64 битная?
...
Рейтинг: 0 / 0
Определение возможного типа регистрации dll
    #40118600
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
hlopotun
ну, с регистрацией пока всё получается
Если все получается, то зачем плодить темы? Это уже пятая по счету?
hlopotun
либа со всеми остальными системными лежит рядом в windows\ system32 .
Дай угадаю - Windows 64 битная?


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


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