why I can't connect remote com inside a com component?
hi,
I write a com componenet with atl named "substation" and I can connected
this remote componenet use a mfc dialog client,but when I use the same code
to connect the same remote component inside the com return E_ACCESSDENIED?
why?
thanks a lot!
the source code:
idl:
// StarSvr.idl//
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(CF53159E-4893-474B-B819-3A93BA30623E),
helpstring("ISubstation interface"),
pointer_default(unique)
]
interface ISubstation : IUnknown{
[helpstring("method OnTime")] HRESULT OnTime([in] BSTR host, [in] VARIANT
varTime);
[helpstring("method Add")] HRESULT Add([in] LONG l1, [in] LONG l2, [out]
LONG* lR);
[helpstring("method ConnectTo")] HRESULT ConnectTo([in] BSTR host, [in]
BSTR user, [in] BSTR pass, [in] BSTR domain);
[helpstring("method SetName")] HRESULT SetName([in] BSTR name);
};
[
uuid(F3A94BC5-8EE8-478D-AAAD-8A9EBE406CFA),
version(1.0),
helpstring("StarSvr 1.0 library")
]
library StarSvrLib
{
importlib("stdole2.tlb");
[
uuid(BE5F9E61-26D0-4F52-AD6F-EFD1262C5F1A),
helpstring("Substation Class")
]
coclass Substation
{
[default,source] interface ISubstation;
};
};
mfc dialog connect code:
COSERVERINFO si;
ZeroMemory(&si, sizeof(si));
COAUTHIDENTITY author_id;
ZeroMemory(&author_id, sizeof(COAUTHIDENTITY));
author_id.Flags =SEC_WINNT_AUTH_IDENTITY_UNICODE;//
SEC_WINNT_AUTH_IDENTITY_ANSI ;
author_id.User = (unsigned short*)m_sUserName.GetBuffer();
author_id.UserLength = _tcslen((TCHAR*)author_id.User);
author_id.Domain = (unsigned short*)m_sDomain.GetBuffer();;
author_id.DomainLength = _tcslen((TCHAR*)author_id.Domain);
author_id.Password = (unsigned short*)m_sPassword.GetBuffer();
author_id.PasswordLength = _tcslen((TCHAR*)author_id.Password);
COAUTHINFO athn;
ZeroMemory(&athn, sizeof(COAUTHINFO));
athn.dwAuthnSvc =
RPC_C_AUTHN_WINNT;//RPC_C_AUTHN_GSS_KERBEROS;//RPC_C_AUTHN_WINNT;
athn.dwAuthzSvc = RPC_C_AUTHZ_NONE;
athn.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CALL;//RPC_C_AUTHN_LEVEL_NONE;//
athn.dwCapabilities = EOAC_NONE;
athn.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
athn.pAuthIdentityData = &author_id;
athn.pwszServerPrincName = NULL;
si.pwszName = m_sHostName.GetBuffer();//
L"\\\\mywin2k3";//L"\\\\Chenxingtian-pc";
si.pAuthInfo = &athn;
si.dwReserved1 = 0;
si.dwReserved2 = 0;
MULTI_QI rgmqi[2];
ZeroMemory(rgmqi, sizeof(rgmqi));
rgmqi[0].pIID = &IID_ISubstation;
rgmqi[1].pIID = &IID_IConnectionPointContainer;
hRes = CoCreateInstanceEx(CLSID_Substation, NULL, CLSCTX_REMOTE_SERVER,
&si, 2, rgmqi);
if (hRes == S_OK)
{
m_pSubstation = (ISubstation*)rgmqi[0].pItf;
m_pConnectionPointContainer = (IConnectionPointContainer*)rgmqi[1].pItf;
// pClientSecurity = (IClientSecurity*)rgmqi[2].pItf;
}
else
{
CString str;
str.Format(_T("CoCreateInstanceEx Error! Error number
is:%x,%s"),hRes,_com_error(hRes).Description());
m_ctrlEditMsg.ReplaceSel(str);
return ;
}
ATLASSERT(m_pSubstation != NULL);
hRes = m_pConnectionPointContainer->FindConnectionPoint(IID_ISubstation,
&m_pConnectionPoint);
ASSERT(SUCCEEDED(hRes));
hRes = m_pConnectionPoint->Advise((IUnknown*)m_pSubstationCon, &m_dwAdvise);
if(hRes != S_OK)
{
CString str;
str.Format(_T("Advise Error! Error number is:%x"),hRes);
m_ctrlEditMsg.ReplaceSel(str);
return ;
}
ATLENSURE(SUCCEEDED(hRes) && m_dwAdvise != 0);
//connect inside com:
STDMETHODIMP CSubstation::ConnectTo(BSTR host, BSTR user, BSTR pass, BSTR
domain)
{
COSERVERINFO si;
ZeroMemory(&si, sizeof(si));
COAUTHIDENTITY author_id;
ZeroMemory(&author_id, sizeof(COAUTHIDENTITY));
CString shost(host);
CString suser(user);
CString spass(pass);
CString sdomain(domain);
author_id.Flags =SEC_WINNT_AUTH_IDENTITY_UNICODE;//
SEC_WINNT_AUTH_IDENTITY_ANSI ;SEC_WINNT_AUTH_IDENTITY_ANSI
author_id.User = (unsigned short*)suser.GetBuffer();//(unsigned
short*)CString(user).GetBuffer();//(unsigned short*)m_sUserName.GetBuffer();
author_id.UserLength = wcslen((const wchar_t *)author_id.User);
author_id.Domain = (unsigned short*)sdomain.GetBuffer();//(unsigned
short*)CString(domain).GetBuffer();//(unsigned
short*)m_sDomain.GetBuffer();;
author_id.DomainLength = wcslen((const wchar_t *)author_id.Domain);
author_id.Password = (unsigned short*)spass.GetBuffer();//(unsigned
short*)CString(pass).GetBuffer();//(unsigned short*)m_sPassword.GetBuffer();
author_id.PasswordLength = wcslen((const wchar_t *)author_id.Password);
COAUTHINFO athn;
ZeroMemory(&athn, sizeof(COAUTHINFO));
athn.dwAuthnSvc =
RPC_C_AUTHN_WINNT;//RPC_C_AUTHN_GSS_KERBEROS;//RPC_C_AUTHN_WINNT;
athn.dwAuthzSvc = RPC_C_AUTHZ_NONE;
athn.dwAuthnLevel =
RPC_C_AUTHN_LEVEL_NONE;//RPC_C_AUTHN_LEVEL_CALL;//RPC_C_AUTHN_LEVEL_NONE;//
athn.dwCapabilities = EOAC_NONE;
athn.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
athn.pAuthIdentityData = &author_id;
athn.pwszServerPrincName = NULL;
si.pwszName = shost.GetBuffer();//m_sHostName.GetBuffer();//
L"\\\\mywin2k3";//L"\\\\Chenxingtian-pc";
si.pAuthInfo = &athn;
si.dwReserved1 = 0;
si.dwReserved2 = 0;
MULTI_QI rgmqi[2];
ZeroMemory(rgmqi, sizeof(rgmqi));
rgmqi[0].pIID = &IID_ISubstation;
rgmqi[1].pIID = &IID_IConnectionPointContainer;
ISubstation* pSubstation = NULL;
IConnectionPointContainer* pConnectionPointContainer = NULL;
IConnectionPoint* pConnectionPoint = NULL;
DWORD dwAdvise;
CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
HRESULT hRes = CoInitializeSecurity(sd, -1, NULL,
NULL,RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE,
NULL);//<-return E_ACCESSDENIED
hRes = CoCreateInstanceEx(CLSID_Substation, NULL, CLSCTX_REMOTE_SERVER,
&si, 2, rgmqi);
if (hRes == S_OK)
{
pSubstation = (ISubstation*)rgmqi[0].pItf;
pConnectionPointContainer = (IConnectionPointContainer*)rgmqi[1].pItf;
// pClientSecurity = (IClientSecurity*)rgmqi[2].pItf;
}
else
return S_FALSE;
pSubstation->SetName(CComBSTR(host));
hRes = pConnectionPointContainer->FindConnectionPoint(IID_ISubstation,
&pConnectionPoint);
ISubstation* pConn;
QueryInterface(IID_ISubstation,(void**)&pConn);
hRes = pConnectionPoint->Advise((IUnknown*)pConn, &dwAdvise);
return S_OK;
}