powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 5, Delphi 7 и своиство System.Win.ComObj.TComServerObject.PerUserRegistr
4 сообщений из 4, страница 1 из 1
Delphi 5, Delphi 7 и своиство System.Win.ComObj.TComServerObject.PerUserRegistr
    #40118909
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня,

по доке вроде это свойство описано с XE6.
В связи с этим возник вопрос: возможна ли из коробки регистрация Com сделанных в D5 и D7 для текущего пользователя? Сомнения возникли потому что при компиляции такой dll если вписать в export функцию DllInstall то она не находится в стандартных Com юнитах D5 и D7.

И параллельно вопрос, если это свойство появилось только в XE6 то как при вызове стандартной DllRegisterServer и DllUnregisterServer передать далее что регистрация производится для текущего пользователя (если они в принципе способны обработать такую регистрацию)? У меня к сожалению нет исходников от D5,D7 с ComServ и ComObj дабы посмотреть самому (или как альтернатива киньте в меня этими файлами дабы смог сам посмотреть).

с хе6 и далее работает такая схема:
Код: 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.
function myServRegisterPerUser: HResult;
begin
  TComServerObject.PerUserRegistration := True;

  Result := DllRegisterServer;
  if Result = S_OK then
    try
       // здесь можно добавить/удалить свои записи в реестре
    except
      Result := E_Fail;
    end;
end;

function myServUnRegisterPerUser: HResult;
begin
  TComServerObject.PerUserRegistration :=True;

  Result := DllUnRegisterServer;
  if Result = S_OK then
    try
      // здесь можно добавить/удалить свои записи в реестре
    except
      Result := E_Fail;
    end;
end;



Спасибо
...
Рейтинг: 0 / 0
Delphi 5, Delphi 7 и своиство System.Win.ComObj.TComServerObject.PerUserRegistr
    #40118951
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun,
нашел исходники от D7:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TComServer.UpdateRegistry(Register: Boolean);
begin
  if FTypeLib <> nil then
    if Register then
      RegisterTypeLibrary(FTypeLib, GetModuleFileName) else
      UnregisterTypeLibrary(FTypeLib);
  FRegister := Register;
  ComClassManager.ForEachFactory(Self, FactoryUpdateRegistry);
end;


начиная с XE6 это выглядит уже так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;


а ключевое отличие тут:
D7
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TComObjectFactory.UpdateRegistry(Register: Boolean);
const
  ThreadStrs: array[TThreadingModel] of string =
    ('', 'Apartment', 'Free', 'Both', 'Neutral');
var
  ClassID, ProgID, ServerKeyName, ShortFileName: string;
begin
  if FInstancing = ciInternal then Exit;
  ClassID := GUIDToString(FClassID);
  ProgID := GetProgID;
  ServerKeyName := 'CLSID\' + ClassID + '\' + FComServer.ServerKey;
  if Register then
  begin
    CreateRegKey('CLSID\' + ClassID, '', Description);
.........


и XE6
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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);
....................



т.е.: ComServer.GetRegRootAndPrefix(RootKey, RegPrefix);
Можно конечно подменить виртуальную UpdateRegistry но по сути это то же что прописать всё в реестре самому. Что при 2х старых (находяшихся в состоянии выпиливания) dll не имеет смысла.
Походу регистрации на текущего пользователя из коробки в D7 и D5 нет и надо прописывать в реестре всё руками.
...
Рейтинг: 0 / 0
Delphi 5, Delphi 7 и своиство System.Win.ComObj.TComServerObject.PerUserRegistr
    #40119079
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может у кого то есть готовая функция прописывания com dll в ветке HKEY_CURENT_USER созданного в D5 или D7 (функции встроенные в dll DllRegisterServer, DllUnregisterServer не поддерживают регистрацию в HKEY_CURENT_USER а DllInstall отсутствует как таковая). По идее можно думаю и в HKEY_LOCAL_MACHINE, я допилю. Главное что бы писала сама в реестр а не использовала встроенные в com dll функции. Сама программа регистрации на 10.4.
Попробовал допилить родную из ComObj для регистрации Com dll из стороннего приложения но её надо сочетать с RegisterTypeLibrary а она опять лезер во встроенные RegisterTypeLib и UnRegisterTypeLib которые тоже не поддерживают в D5 и D7 регистрацию в ветке HKEY_CURENT_USER. Ну и опять же, поскольку всё вызывается во внешней программе сбор параметров удручает. Чувствую не успеваю :( Или все выходные погубить, или может кто то выручит.
Вот промежуточный результат если кому интересно:
Код: 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.
procedure BpsRegisterComDirect(Register: Boolean;
  AClassID: string;
  AFile, ARegPrefix, AClassName, AComServerName, AServerKey, ADescription: string;
  AThreadingModel: TThreadingModel = tmApartment);
const
  ThreadStrs: array[TThreadingModel] of string =
    ('', 'Apartment', 'Free', 'Both', 'Neutral');
var
  ClassID, ProgID, ServerKeyName, ShortFileName, RegPrefix: string;
  RootKey: HKEY;
  function _GetProgID: string;
  begin
    if AClassName <> '' then
      Result := AComServerName + '.' + AClassName else
      Result := '';
  end;

begin
  if TComServerObject.PerUserRegistration then
     RootKey := HKEY_CURRENT_USER
  else
     RootKey := HKEY_LOCAL_MACHINE;

  RegPrefix := ARegPrefix;  // SOFTWARE\Classes\WOW6432Node
  ClassID := AClassID;
  ProgID := _GetProgID;
  ServerKeyName := RegPrefix + 'CLSID\' + ClassID + '\' + AServerKey;
  if Register then
  begin
    CreateRegKey(RegPrefix + 'CLSID\' + ClassID, '', ADescription, RootKey);
    ShortFileName := AFile;
    if AnsiPos(' ', ShortFileName) <> 0 then
      ShortFileName := ExtractShortPathName(ShortFileName);
    CreateRegKey(ServerKeyName, '', ShortFileName, RootKey);
    if (AThreadingModel <> tmSingle) and IsLibrary then
      CreateRegKey(ServerKeyName, 'ThreadingModel', ThreadStrs[AThreadingModel], RootKey);
    if ProgID <> '' then
    begin
      CreateRegKey(RegPrefix + ProgID, '', ADescription, 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;


п.с нет чёткого понимания что минимально надо прописывать. Попробовал сравнить реестр до и после регистрации через RegSvr32 в HKEY_LOCAL_MACHINE, получилось 256 изменённых или добавленных параметров, что то не верится что все они необходимы.
Думаю основные параметры эти:

Код: 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.
// Это часть для TypeLib
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{78461905-024F-45B3-943F-0F9BD48D6658}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{78461905-024F-45B3-943F-0F9BD48D6658}\1.0]
@="Bps Messaging Framework"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{78461905-024F-45B3-943F-0F9BD48D6658}\1.0\0]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{78461905-024F-45B3-943F-0F9BD48D6658}\1.0\0\win32]
@="Z:\\Messaging.dll"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{78461905-024F-45B3-943F-0F9BD48D6658}\1.0\FLAGS]
@="0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{78461905-024F-45B3-943F-0F9BD48D6658}\1.0\HELPDIR]
@="Z:\\"

// А эта для com как я понимаю
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{D95F4185-AD64-4F1E-BF86-081E735196E9}]
@=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{D95F4185-AD64-4F1E-BF86-081E735196E9}\InprocServer32]
@="Z:\\Messaging.dll"
"ThreadingModel"="Apartment"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{D95F4185-AD64-4F1E-BF86-081E735196E9}\ProgID]
@="Messaging.bpsMsSession"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{D95F4185-AD64-4F1E-BF86-081E735196E9}\TypeLib]
@="{78461905-024F-45B3-943F-0F9BD48D6658}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{D95F4185-AD64-4F1E-BF86-081E735196E9}\Version]
@="1.0"



но опасаюсь что это не все.

Спасибо
...
Рейтинг: 0 / 0
Delphi 5, Delphi 7 и своиство System.Win.ComObj.TComServerObject.PerUserRegistr
    #40119120
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, действительно не всё.
Регистрируются ещё всё, что подцеплено через встроенную tlb.
Наверное самое простое решение это взять разницу до и после регистрации dll, заменить в ней HKLM на HKCU и напрямую записать в реестр.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 5, Delphi 7 и своиство System.Win.ComObj.TComServerObject.PerUserRegistr
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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