Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 COM объект в сервисе WinXP - проблема  [new]
I_m_Mad
Member

Откуда: Дальний Восток
Сообщений: 30
Доброе время суток!

Прошу совета по вопросу:
Есть сервис, написанный на Delphi 6 (создан через File -New - Service App).
В него встроен COM-объект.
Необходимо из приложения-клиента получить доступ к этому объекту
(именно к экземпляру в запушенном сервисе).
Вот код создания объекта:
CoInitialize(nil);
ST := TSvcTest.Create; //COM-объект
RegisterActiveObject(ST, CLASS_SvcTest,ACTIVEOBJECT_STRONG, hReg);

Проблема в том, что ST не регистрируется в ROT (Running Object Table),
соответственно вызов GetActiveObject не работает.
Пробовал через IRunningObjectTable.Register - то же самое.
К тому же из сервиса вообще невозможно получить интерфейс _любого_ запушенного Com-сервера (пробовал Word, Excel). Из обычного приложения все работает.
Объект в системе зарегистрирован.

В то же время при создании _обычного_ приложения с аналогичным COM-объектом все ok!
Код абсолютно такой же, знак в знак.
Чувствую, что дело в особенностях сервисов WinXP, но что именно - никак не пойму.

Подскажите, плз, куда копать?

WinXP Prof
Delphi 6 SP2
18 мар 05, 04:56    [1396205]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
В журнале RSDN Magazine (печатном) была статья на тему сервисов (мож и на http://www.rsdn.ru есть).
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
18 мар 05, 10:02    [1396582]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
I_m_Mad
Member

Откуда: Дальний Восток
Сообщений: 30
На РСДН я уже прочитал все что имеет отношение к COM в сервисах...и в статьях, и в форуме.
К сожалению, не помогло. Может, кто уже сталкивался именно с такой проблемой?
18 мар 05, 10:55    [1396800]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
I_m_Mad
Member

Откуда: Дальний Восток
Сообщений: 30
Уф. Проблема, кажется, решилась.
Вот рабочий код:
    
    CoInitialize(nil);
    ST := TSvcTest.Create;
    ClassName := StringToOleStr(GuidToString(Class_SvcTest));
    CreateItemMoniker('!', ClassName, Moniker);
    GetRunningObjectTable(0, ROT);
    ROT.Register(ROTFLAGS_REGISTRATIONKEEPSALIVE or ROTFLAGS_ALLOWANYCLIENT, ST, Moniker, hReg);
    SysFreeString(ClassName);

var ROT : IRunningObjectTable;
begin
    GetRunningObjectTable(0, ROT);
    ROT.Revoke(hReg);
end;


Проблема была, во-первых, в вызове CreateItemMoniker (почему-то нужен именно он, а не CreatePointerMoniker, как я сделал сначала), во-вторых, сервис нужно запускать под аккаунтом текущего юзера (хотя думаю, CoInitializeSecurity решит это). Информация взята с groups.google.com
22 мар 05, 04:13    [1403974]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
I_m_Mad
Member

Откуда: Дальний Восток
Сообщений: 30
Топик можно закрывать
22 мар 05, 04:14    [1403975]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: COM объект в сервисе WinXP - проблема  [new]
Infernal V. Raven
Member

Откуда: St.Petersburg
Сообщений: 1710
Налетел на те же грабли. Не могу запустить под разными пользователями. Может кто-то решил уже?
24 май 07, 16:49    [4181338]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Infernal V. Raven
Member

Откуда: St.Petersburg
Сообщений: 1710
все еще надеюсь
25 май 07, 14:15    [4185561]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Infernal V. Raven
все еще надеюсь

знаю совет бывалых, параноидальная проверка ошибок после каждой строки в COM.
25 май 07, 14:44    [4185819]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Infernal V. Raven
Member

Откуда: St.Petersburg
Сообщений: 1710
Petro123
Infernal V. Raven
все еще надеюсь

знаю совет бывалых, параноидальная проверка ошибок после каждой строки в COM.
Сам так делаю. Тем более в сервисе. CoInitializeSecurity, не помогает, тем более, что пр проверке для RPC на локальном компе все равно используется встроенная проверка Windows
25 май 07, 15:01    [4185970]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Infernal V. Raven
Member

Откуда: St.Petersburg
Сообщений: 1710
RSDN

Нужно также заметить, что если и клиент, и сервер запущены на одной машине, то всегда будет использоваться RPC_C_AUTHN_WINNT. Причем попытка указать значения, отличные от RPC_C_AUTHN_WINNT или RPC_C_AUTHN_DEFAULT, приведет к ошибке (0x800706D3 – «The authentication service is unknown.», неизвестный сервис аутентификации). И вообще, если защита работает на локальном компьютере – это не означает, что она автоматически заработает и в сетевом режиме. Так что всегда следует тестировать приложение в условиях, как можно более приближенных к условиям реального использования.


Сервис создает объект и регестрирует его. Объект внутри сервиса рабочий. Но клиенты отваливаются с ошибкой "Операция не доступна". Есть хоть намеки куда копать?
---
aka VIR. No pity. No mercy. No remorse. No Regret
25 май 07, 15:08    [4186027]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
точно прочитал статью на RSDN?
Там с процессом идут всякие PID/SID и прочяя шняга.
Спрашивай у Сишников и на том форуме RSDN
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
25 май 07, 15:18    [4186120]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Infernal V. Raven
Member

Откуда: St.Petersburg
Сообщений: 1710
Нашел исходник на support.microsoft, как раз то что надо. http://support.microsoft.com/kb/q156673/
25 май 07, 20:14    [4187974]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Infernal V. Raven
Member

Откуда: St.Petersburg
Сообщений: 1710
Господа, все получилось, как надо.
1. Я решил не ограничиться регистрацией объекта, но еще и перегрузил метод CreateComObject у фабрики классов. Она не создает новый объект, при наличии существующего.
2. При регистрации объекта в ROT надо указать дополнительный флаг:
rot.Register( ROTFLAGS_ALLOWANYCLIENT, unk, mk, dwRegister );
иначе налетите на те же грабли, что и я когда чесал репу, отчего же новые клиенты отваливаются, после выгрузки всех клиентов. Кстати дефолтный режим dcomcnfg не очень хорош, поэтому пока придумываю как выкручиваться.

P.S. справедливости ради хочу заметить, что работать с COM проще в Си, примеры все там, перевод констант RPC_C_xxx Borland вообще поленился делать.
26 май 07, 20:13    [4189553]     Ответить | Цитировать Сообщить модератору
 Re: COM объект в сервисе WinXP - проблема  [new]
Infernal V. Raven
Member

Откуда: St.Petersburg
Сообщений: 1710
Поправочка:
result := rot.Register( ROTFLAGS_ALLOWANYCLIENT or ROTFLAGS_REGISTRATIONKEEPSALIVE, unk, mk, dwRegister );
26 май 07, 20:15    [4189555]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить