Re[2]: не работает без отладчика
От: VictorBoiko  
Дата: 18.01.10 21:00
Оценка:
Здравствуйте, filkov, Вы писали:

F>Здравствуйте, VictorBoiko, Вы писали:


VB>>Что я делаю не так и почему под отладчиком у меня всё замечательно?


F>ХЗ в общем-то ответ правильный.

F>Много чего может не хватать.

спасибо, за конструктивный ответ

F>Совершенно не зная Вашей задачи, я бы поинтересовался:


Моя задача состоит в следущем:
Есть сервер (сервис.ехе), в который включен простой объект АТЛ, имеющий свой интерфейс, который в свою очередь имеет некоторые методы
Есть клиент (дайлог приложение MFC с поддержкой ATL).

Клиент подключается к серверу и передает указатель на свой интерфейс. После этого сервер его вызывает. Вот код клиента — все инициализации и проверки скипаю для уменьшения кода (Запускаю сервис от имени Victor с паролем 123), коннекчусь так же — иначе не работает:


    MULTI_QI mqiInfo;
    IID iid = IID_IATLService6Interface;
    mqiInfo.pIID = &iid;
    mqiInfo.pItf = NULL;

    COSERVERINFO csInfo;
    COAUTHINFO caInfo;
    COAUTHIDENTITY caId;
    LPWSTR pcServName = SysAllocString(L"127.0.0.1");
    csInfo.pwszName = pcServName;
    csInfo.pAuthInfo = &caInfo;

    caInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CONNECT;
    caInfo.dwAuthnSvc = RPC_C_AUTHN_WINNT;
    caInfo.dwAuthzSvc = RPC_C_AUTHZ_NONE;
    caInfo.dwCapabilities = EOAC_NONE;
    caInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
    caInfo.pAuthIdentityData = &caId;
    caInfo.pwszServerPrincName = NULL;

    caId.User = (USHORT*)SysAllocString(L"Victor");
    caId.Password = (USHORT*)SysAllocString(L"123");
    caId.Domain = (USHORT*)SysAllocString(L"");
    caId.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
    caId.UserLength = 6;
    caId.PasswordLength = 3;
    caId.DomainLength = 0;

    HRESULT hr = CoCreateInstanceEx(CLSID_ATLService6Interface,NULL,CLSCTX_REMOTE_SERVER,&csInfo,1,&mqiInfo);

        //вот здесь и возникает ошибка без отладчика //hr = 0x80080005 Ошибка при выполнении приложения-сервера
        //это в клиенте
        //когда сервер работает под отладчиком - всё замечательно


    pServerInterface = reinterpret_cast<IATLService6Interface *>(mqiInfo.pItf);

    mqiInfo.pItf = NULL;
    IClientSecurity *piClSec = NULL;
    hr = pServerInterface->QueryInterface(IID_IClientSecurity, (void **) &piClSec);
    hr = piClSec->SetBlanket(pServerInterface,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, &caId, EOAC_NONE);

    CComObject<CClientInterface6>* pSinkClass;
    CComObject<CClientInterface6>::CreateInstance(&pSinkClass);
    hr = pSinkClass->QueryInterface (IID_IDispatch, (LPVOID*)&m_pSinkUnk);
    hr = pServerInterface->Connect(m_pSinkUnk);



вот сервер, хотя нужен ли он?


idl:

[
    object,
    uuid(1F219B7B-02CE-4AF4-85FD-402B664F7D41),
    dual,
    nonextensible,
    helpstring("Интерфейс IATLService6Interface"),
    pointer_default(unique)
]
interface IATLService6Interface : IDispatch{
    [id(1), helpstring("метод Connect")] HRESULT Connect([in] IDispatch* IClient);

.........
};




F>1. Вам действительно требуется контекст CLSCTX_REMOTE_SERVER ?

F> CLSCTX_ALL не помогает?

Если честно, то понятия не имею чем это может отличаться — брал из примеров, под отладчиком всё работало — думал всё делаю правильно. Поменял на CLSCTX_ALL — не работает без отладчика, а с под отладчиком аж бегом тоже работает, т.е. флаги тут не при чем))). Но про эти флаги эти почитаю.

F>2. Ваш сервис действительно работает на удалённой машине и при этом логинится как Victor ? (для сервиса типично работать под Local System account).


Да, однозначно. И необязательно на удаленной, даже на одной и той же машине если запускаю без отладчика сервер, клиент не подключается. Я специально задал этот логин сервису, т.к. незнаю как потом из клиента коннектиться, если будет Local System account — это следующий пункт моих изысканий (если несложно, намекните что почитать). При этом однозначно из студии он стартует под Victor и я думал коль уж он так работает — так и буду к нему подключаться.

F>3. Бы убедились, что сервис работает на момент запуска клиента?


Точно работает

F>4. Вот этот линк не поможет?


Читаю...

F>Удачи


Может быть еще какие куски исходников надо? Все выложу. Не могу побороть уже 3-ий день это (((
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.