Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проверить, зарегистрирована dll в HKEY_CLASSES_ROOT или HKEY_CURRENT_USER / 5 сообщений из 5, страница 1 из 1
01.12.2021, 13:58
    #40116431
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить, зарегистрирована dll в HKEY_CLASSES_ROOT или HKEY_CURRENT_USER
Всем доброго дня,

в процедуре инсталляции надо проверить - последняя регистрация была для всех пользователей или для конкретного. И если была для всех а теперь надо зарегистрировть на конкретного пользователя то сначала дерегистрировать для всех и потом регистрировать на конкретного пользователя.
Можно конечно просто посмотреть где в реестре зарегана эта библиотека и по прямому пути прочитать но если в будующем этот путь микрософт поменяет то это перестанет работать. Посоветуйте альтернативный метод который позволит учесть возможное изменение пути мелкософтом в будующем (а возможно и в прошлом, если в той же 8й или 7й винде путь отличается от 10й винды).

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

Спасибо.
...
Рейтинг: 0 / 0
01.12.2021, 14:03
    #40116432
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить, зарегистрирована dll в HKEY_CLASSES_ROOT или HKEY_CURRENT_USER
о, Господи!
эта музыка будет вечной - он таки заменил батарейки! ©
...
Рейтинг: 0 / 0
01.12.2021, 14:16
    #40116437
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить, зарегистрирована dll в HKEY_CLASSES_ROOT или HKEY_CURRENT_USER
hlopotun
но если в будующем этот путь микрософт поменяет
Не поменяет. API для регистрации COM нет. Все лазят напрямую в реестр
...
Рейтинг: 0 / 0
01.12.2021, 15:35
    #40116462
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить, зарегистрирована dll в HKEY_CLASSES_ROOT или HKEY_CURRENT_USER
_Vasilisk_
hlopotun
но если в будующем этот путь микрософт поменяет
Не поменяет. API для регистрации COM нет. Все лазят напрямую в реестр


вот упрощённая функция регистратии dll:
Код: 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.
function _RegisterComServer (DLLName: string): boolean;
type
  TRegProc = function: HResult; stdcall;
const
  RegProcName = 'DllRegisterServer'; { Do not localize }
var
  Handle: THandle;
  RegProc: TRegProc;
  FullPath: string;
begin

  if ExtractFilepath (Fullpath) = '' then
    Fullpath:= ExtractFilepath (ParamStr (0)) + Fullpath;

  if AnsiTextPos ('.DLL', Result) = 0 then
    Fullpath := Fullpath+ '.DLL';

  Handle := SafeLoadLibrary (Fullpath);
  if Handle <= HINSTANCE_ERROR then
    Result := False
    else
    try
      RegProc := GetProcAddress (Handle, RegProcName);
      Result := Assigned (RegProc);
      if Result then
        Result := RegProc = S_OK;
    finally
      FreeLibrary(Handle);
    end;
end;


а это для регистрации tlb:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function _LoadTypelib (DLL_TLB_Name: string; out tlib: ITypeLib): HResult;
var
  str: PWidechar;
  size: integer;
begin

  size := (length (DLL_TLB_Name) + 1) * 2;
  GetMem (str, size);
  try
    StringToWidechar (DLL_TLB_Name, str, size);
    Result := LoadTypelib (str, tlib);
  finally
    FreeMem (str);
  end;
end;


в обоих случаях напрямую работа с ветками не ведётся

также при дерегистрации:
Код: 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.
function _UnRegisterComServer (DLLName: string): boolean;
type
  TRegProc = function: HResult; stdcall;
const
  RegProcName = 'DllUnregisterServer'; { Do not localize }
var
  Handle: THandle;
  RegProc: TRegProc;
  FullPath: string;
begin
  if ExtractFilepath (Fullpath) = '' then
    Fullpath:= ExtractFilepath (ParamStr (0)) + Fullpath;

  if AnsiTextPos ('.DLL', Result) = 0 then
    Fullpath := Fullpath+ '.DLL';

  Handle := SafeLoadLibrary (Fullpath);
  if Handle <= HINSTANCE_ERROR then
    Result := False
    else
    try
      RegProc := GetProcAddress (Handle, RegProcName);
      Result := Assigned (RegProc);
      if Result then
        Result := RegProc = S_OK;
    finally
      FreeLibrary(Handle);
    end;
end;


а дерегистрировать tlb пока не разобрался.

по сути если откинуть проблему дерегистрации tlb нужно только определить где была зарегистрирована dll, tlb ранее
...
Рейтинг: 0 / 0
01.12.2021, 15:53
    #40116468
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить, зарегистрирована dll в HKEY_CLASSES_ROOT или HKEY_CURRENT_USER
hlopotunв обоих случаях напрямую работа с ветками не ведётся

Да щаззз... Ты что, никогда не заглядывал что делается в вызываемой тобой функции?..

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


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