Здравствуйте, 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-ий день это (((