描述:
传递Ado的Recordset当Com服务器和客户端在统一机器上可以正确执行,但其它机器就不可以,两个机子Ado都是2。8版本,而其它的一些Com调用没问题(传递字符、数字等)。先谢过了
Server代码
STDMETHODIMP CAAAATest::GetServerData(IUnknown** sevData)
{
AFX_MANAGE_STATE(AfxGetAppModuleState());
HRESULT hr;
DbCon dbcn;
_ConnectionPtr cn=dbcn.GetDBConnection();
_RecordsetPtr rs;
rs.CreateInstance(__uuidof(Recordset));
rs->CursorLocation =adUseClient;
try
{
hr=rs->Open(_variant_t((_bstr_t)"Select * from KSSite"),_variant_t((IDispatch *)cn),adOpenKeyset,adLockOptimistic,adCmdText);
}
catch(_com_error& er)
{
}
rs->put_ActiveConnection(vtMissing);
rs->putref_ActiveConnection(NULL);
_RecordsetPtr cln=rs->Clone(adLockOptimistic);
rs->Close();
rs.Release();
*sevData=(IUnknown*)cln.Detach();
dbcn.PutDBConnection(cn);
return S_OK;
}
客户端代码
COAUTHIDENTITY authidentity;
CString nm,dn,ps;
nm=_T("username");
dn=_T("domain");
ps=_T("pass");
authidentity.User =(USHORT *)nm.AllocSysString();
authidentity.UserLength = nm.GetAllocLength();
authidentity.Domain =(USHORT *)dn.AllocSysString();
authidentity.DomainLength =dn.GetAllocLength();
authidentity.Password =(USHORT*)ps.AllocSysString();
authidentity.PasswordLength = ps.GetAllocLength();
authidentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
IAAAATest* tst;
COAUTHINFO auth;
auth.dwAuthnSvc=-1;
auth.dwAuthzSvc=0;
auth.pwszServerPrincName=NULL;
auth.dwAuthnLevel=RPC_C_AUTHN_LEVEL_DEFAULT;
auth.dwImpers />
auth.pAuthIdentityData=&authidentity;
auth.dwCapabilities=EOAC_NONE;
COSERVERINFO sev;
sev.dwReserved1=0;
sev.dwReserved2=0;
sev.pAuthInfo =&auth;
USES_CONVERSION ;
sev.pwszName =A2W("Comserver");
MULTI_QI mi;
mi.hr =S_OK;
mi.pIID=&IID_IAAAATest;
mi.pItf =NULL;
HRESULT hr;
hr=CoCreateInstanceEx(CLSID_AAAATest,NULL,CLSCTX_REMOTE_SERVER,&sev,1,&mi);
if(hr!=NOERROR)
{
CString cs;
cs.Format("there is a error %x",hr);
AfxMessageBox(cs);
return ;
}
if (mi.hr!=NOERROR)
{
CString cs;
cs.Format("there is a MQI error %x",hr);
AfxMessageBox(cs);
return ;
}
tst=(IAAAATest*)mi.pItf;
_RecordsetPtr rs;
IUnknown* ink=(IUnknown*)rs.Detach();
hr=tst->GetServerData((IUnknown**) &ink);
if(FAILED(hr))
{
cs.Format("there is a GetServerData error %x",hr);
AfxMessageBox(cs);
tst->Release();
return ;
}
try{
if (ink)
{
rs.Attach((_Recordset*)ink);
ADO_LONGPTR cnt=rs->RecordCount ;
cs.Format("Find Record %d",cnt);
AfxMessageBox(cs);
rs->Close();
rs.Release();
}
else
{
AfxMessageBox("Can not Get ref");
}
tst->Release();
}
catch(_com_error& er)
{
}
谢谢
解决方案1:
不知道是不是要初始化安全性,设置看看
解决方案2:应该不行,recordset里面又不包含数据,你怎么能在另外一台机子上操作原来机子上的数据呢?