Скрытие сообщения об ошибке OLE COM-сервера, когда у пользователя недостаточно прав

Я обновляю проект программного обеспечения Delphi с интерфейсом автоматизации COM, чтобы упростить некоторые пакетные задачи (с помощью сценариев WSH). Само по себе это легко... Однако большинству "реальных" пользователей программного обеспечения этот интерфейс не нужен (или даже не известен), и я хотел бы избавить их от регистрации COM-сервера ИЛИ сообщения об ошибке. это появляется, когда программа не может запустить com-сервер (В настоящее время у программного обеспечения нет установщика - это просто копирование и пересылка. Регистрация чего-либо будет дополнительным шагом для пользователей. Это внутренняя часть, поэтому клиенты к этому привыкли...).

Вот актуальный вопрос: могу ли я программно выяснить, имеет ли текущий пользователь, работающий с программным обеспечением, достаточные права для регистрации COM-сервера, а затем (если нет) попытаться создать сервер? Мне бы хотелось поведение, когда у пользователя нет достаточных прав, сервер автоматизации просто отсутствует (без сообщений об ошибках).

Я попытался добавить попытку поймать вокруг TAutoObjectFactory.Create(...) но это не предотвращает ошибку. Добавление параметра командной строки, который включает сервер, также не работает, потому что тогда создание объекта автоматизации из скрипта запустит программу без этого параметра и, следовательно, также не создаст сервер.

2 ответа

Для решения этой проблемы я использую TMyAutoObjectFactory объект, который наследуется от TAutoObjectFactory и просто переопределяет UpdateRegistry метод с тихим предложением try/ исключением и обновите раздел инициализации внизу, чтобы использовать его. Как это:

type
  TMyAutoObjectFactory=class(TAutoObjectFactory)
  public
    procedure UpdateRegistry(Register: Boolean); override;
  end;

{ TMyAutoObjectFactory }

procedure TMyAutoObjectFactory.UpdateRegistry(Register: Boolean);
begin
  try
    inherited;
  except
    //silent
  end;
end;

initialization
  TMyAutoObjectFactory.Create(ComServer, TMyObjectSomething, Class_MyObjectSomething, ciMultiInstance, tmApartment);
end.

Это заставит ошибку замолчать, но вам все равно нужно будет запустить приложение один раз с правами администратора или попросить установщика добавить необходимые записи реестра.

Я решил проблему, скопировав com-модуль Delphis в проект и поместив блок try-exc вокруг Comserver.Initialize-method(-body), потому что оказывается, что исключение произошло там (а не при регистрации TAutoObjectFactory):

PROCEDURE TComServer.Initialize;
BEGIN
  TRY
    TRY
      UpdateRegistry(FStartMode <> smUnregServer);
    EXCEPT
      ON E: EOleRegistrationError DO
      // User may not have write access to the registry.
      // Squelch the exception unless we were explicitly told to register.
        IF FStartMode = smRegServer THEN RAISE;
    END;
    IF FStartMode IN [smRegServer, smUnregServer] THEN Halt;
    ComClassManager.ForEachFactory(Self, FactoryRegisterClassObject);
  EXCEPT
  ELSE
    FStartSuspended := true;
  END;
END;

Примечание: только внешний блок try мой; остальное - оригинал Delphi5(!). Кажется, это подавляет ошибку (прежде чем кто-либо спросит: да, я знаю, что сервер не работает, но это желаемый результат; по крайней мере, программа запускается - я все равно не понимаю, почему не удается запустить всю программу, если сервер не может быть зарегистрирован).

PS: я не устанавливаю это как принятый ответ, поскольку он "чувствует" слишком как взлом, потому что он оставляет наполовину инициализированный ComServer, и я не знаю, могут ли это иметь какие-либо побочные эффекты...

Другие вопросы по тегам