Error = GetActiveObject + Service
От: green_cannibal  
Дата: 17.03.05 05:16
Оценка:
(Delphi, WinXP)
Функция GetActiveObject, вызываемая из службы, возвращает ноль
Тот же самый код, исполняемый в exe работает нормально

var
  IU: IUnknown;
  I: ISignalling;
begin
  GetActiveObject(CLASS_frSignalling, nil, IU);
  if IU <> nil then
  begin
    I := IU as ISignalling;
    I.OnComplete(OS);
  end
  else
  begin
    ShowMessage('IU = nil');
  end;
end;
Slayer forever
Re: Error = GetActiveObject + Service
От: green_cannibal  
Дата: 17.03.05 07:31
Оценка:
А именно возникает ошибка "недопустимая операция"
В чём может быть дело?
Slayer forever
Re[2]: Error = GetActiveObject + Service
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.03.05 04:48
Оценка:
Здравствуйте, green_cannibal, Вы писали:

_>А именно возникает ошибка "недопустимая операция"

_>В чём может быть дело?

Посмотри описание интерфейса IRunningObjectTable, который задействуется во время GetActiveObject.

The IRunningObjectTable interface manages access to the Running Object Table (ROT), a globally accessible look-up table on each workstation.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Error = GetActiveObject + Service
От: green_cannibal  
Дата: 18.03.05 05:12
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Посмотри описание интерфейса IRunningObjectTable, который задействуется во время GetActiveObject.


Я пробовал, тоже не получается. Когда дело доходит до получения моникера, то мы получаем нулевой указатель. Хотя в это же время можно получить доступ к объекту из простого ехе. Всё дело в безопасности. Так как, если разместить вызов GetActiveObject в конструкторе сервиса и произвести его регистрацию, то функция выполнится успешно. Если же запускать сервис из SCM (т.е. под учётной записью SYSTEM), то получаем ошибку "Недопустимая операция". Пробовал отключать безопасность с помощью CoInitializeSecurity — непомогает.
Есть идеи?
Slayer forever
Re[4]: Error = GetActiveObject + Service
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.03.05 05:29
Оценка: 2 (1)
Здравствуйте, green_cannibal, Вы писали:

g_c>Я пробовал, тоже не получается. Когда дело доходит до получения моникера, то мы получаем нулевой указатель. Хотя в это же время можно получить доступ к объекту из простого ехе. Всё дело в безопасности. Так как, если разместить вызов GetActiveObject в конструкторе сервиса и произвести его регистрацию, то функция выполнится успешно. Если же запускать сервис из SCM (т.е. под учётной записью SYSTEM), то получаем ошибку "Недопустимая операция". Пробовал отключать безопасность с помощью CoInitializeSecurity — непомогает.


Если служба и требуемый объект находятся в разных WinSTA, то нет возможности получить его через ROT. Просто потому что ROT службы не знает ничего о другой ROT. Таково, наверное, положение дел.

Почитай Защита в DCOM/COM+
Автор(ы): Владислав Чистяков
Дата: 28.01.2002
.

Также посмотри IRunningObjectTable::Register, который используется функцией RegisterActiveObject(). Особенно описание флага ROTFLAGS_ALLOWANYCLIENT.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.