(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;
Здравствуйте, Vi2, Вы писали:
Vi2>Посмотри описание интерфейса IRunningObjectTable, который задействуется во время GetActiveObject.
Я пробовал, тоже не получается. Когда дело доходит до получения моникера, то мы получаем нулевой указатель. Хотя в это же время можно получить доступ к объекту из простого ехе. Всё дело в безопасности. Так как, если разместить вызов GetActiveObject в конструкторе сервиса и произвести его регистрацию, то функция выполнится успешно. Если же запускать сервис из SCM (т.е. под учётной записью SYSTEM), то получаем ошибку "Недопустимая операция". Пробовал отключать безопасность с помощью CoInitializeSecurity — непомогает.
Есть идеи?
Здравствуйте, green_cannibal, Вы писали:
g_c>Я пробовал, тоже не получается. Когда дело доходит до получения моникера, то мы получаем нулевой указатель. Хотя в это же время можно получить доступ к объекту из простого ехе. Всё дело в безопасности. Так как, если разместить вызов GetActiveObject в конструкторе сервиса и произвести его регистрацию, то функция выполнится успешно. Если же запускать сервис из SCM (т.е. под учётной записью SYSTEM), то получаем ошибку "Недопустимая операция". Пробовал отключать безопасность с помощью CoInitializeSecurity — непомогает.
Если служба и требуемый объект находятся в разных WinSTA, то нет возможности получить его через ROT. Просто потому что ROT службы не знает ничего о другой ROT. Таково, наверное, положение дел.