各位大侠帮忙啊!传递Ado的Recordset当Com服务器和客户端在统一机器上可以正确执行,但其它机器就不可以。

code8110 2004-10-21 11:00:45
传递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.dwImpersonationLevel=RPC_C_IMP_LEVEL_IMPERSONATE;
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)
{

}
谢谢
...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
code8110 2004-10-23
  • 打赏
  • 举报
回复
问题已解决,多谢二位的支持:)
xdljf 2004-10-22
  • 打赏
  • 举报
回复
应该不行,recordset里面又不包含数据,你怎么能在另外一台机子上操作原来机子上的数据呢?
chqu18 2004-10-22
  • 打赏
  • 举报
回复
不知道是不是要初始化安全性,设置看看
code8110 2004-10-22
  • 打赏
  • 举报
回复
to chqu18(bug)
应该和安全性没关系,其他调用都可以,而且我也设置了,不知还有什么其他设置吗
to xdljf(hunter)
dcom可以支持指针的啊,在csdn上有类似的例子啊
多谢二位,我都烦死了
code8110 2004-10-21
  • 打赏
  • 举报
回复
分数太少了,可以再加

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧