⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_39942.htm

📁 vc
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<p>
序号:39942 发表者:笑笑生 发表日期:2003-05-14 19:45:30
<br>主题:关于ADO的Recordset对象的传递
<br>内容:DCOM端(远程机器上)得到Recordset对象(通过_RecordsetPtr-&gt;Open())后,怎样传到客户端?<BR>要求客户端得到的也是一个Recordset对象。<BR>谢谢。<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:FirstHoward 回复日期:2003-05-20 22:30:14
<br>内容:使用IUnknown **或者IDispatch **接口指针,处理的具体方法有:<BR><BR>client:<BR>1. 先生成一个RecordsetPtr空指针,<BR>2. 然后隔离转换成IUnknow:<BR>&nbsp;&nbsp;&nbsp;&nbsp;IUnknown *pUn = (IUnknown*) m_pRecordset.Detach();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这时你的m_pRecordset指向了NULL(0x00000000),不要进行任何操作<BR>3. 调用方法:DCOMObject-&gt;Method( ... , &amp;pUn);<BR>4. 将pUn在附加到m_pRecordset上:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; m_pRecordset.Attach((_Recordset *) pUn);&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>Server: ::Method(..., IUnknown **ppUn)<BR>1. 得到recordset结果集<BR>2. clone一个,将原来的recordset关闭释放<BR>3.&nbsp;&nbsp;*ppUn = (IUnknown *) pRecordSetClone.Detach();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:笑笑生 回复日期:2003-05-26 16:04:51
<br>内容:这样好象不行。<BR>我试了一下,客户端DCOMObject-&gt;Method(.....,&amp;pUn)可以得到一个值,但是m_pRecordset.Attach((_Recordset*)pUn)后,执行m_pRecordset-&gt;MoveFirst()等操作时<BR>会出现例外而推出程序,例外提示是&nbsp;&nbsp; 0xC0000005: Access Violation。<BR>我不是严格的按你说的作的,我现在的做法是:<BR>Client<BR>_RecordsetPtr pRs;<BR>DCOMObject-&gt;Method(.., (IUnknown**)&amp;pRs);<BR>pRs-&gt;MoveFirst();<BR><BR>Server:Method(..,IUnknown **pRs)<BR>_RecordsetPst m_pRs;<BR>m_pRs.CreateInstance(..);<BR>m_pRs-&gt;Open(..,..,..,);<BR>*pRs=(IUnknown *)m_pRs.Detach();<BR><BR>结果就是客户端的pRs里可以得到一个值,但通过这个指针调用方法是出现例外。<BR><BR>服务器端一定要clone一个然后释放原先的那个么?客户端一定要通过一个IUnknown*得到指针后在attach么?<BR><BR>另外,感觉上,这样只是在客户端得到了一个Recordset的指针,在远程DCOM情况下,客户端能得到Recordset的实体么?<BR><BR>多谢回复!!!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:FirstHoward 回复日期:2003-05-26 20:43:08
<br>内容:我也碰见过你说的问题。如果你得到了0x0000005的错误,可能是因为你在COM中关闭了你的connectptr或者recordsetptr对象,然后你在client中想读取记录造成的。你可以进行调试,观察在client中返回的recordset对象的各级继承指针的地址,可能你的最原始级指针指向了地址0x00000000。(因为你已经在COM中释放资源了,这样client中的recordset指针虽然不是0x0000000,但是它的最原始指针却不幸指向了这里)<BR><BR>clone的主要原因是为了释放资源。clone的真正原因是数据的内存拷贝,这样你就可以将COM中的Recordset释放,而clone的recordset由你自己在client中释放。<BR><BR>否则,你的COM程序不好体现一个完整的创建对象-&gt;释放对象的过程。还有一点,别忘了在clone之前put_activeconnecion(vtMissing)。<BR><BR>我都是使用recordsetptr的,目的时摆脱数组的纠缠。凡是多参数的地方,我全部使用recordsetptr,这需要你自己定义recordsetptr,自定义字段名称、变量类别。<BR><BR><BR>用Iunknown指针的原因在于,COM中的.h文件无法识别recordsetptr类型。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:笑笑生 回复日期:2003-05-27 10:03:43
<br>内容:试了一下,还是不行。<BR>指针的值也看了,不是0x00000000,但还是每次都出错。<BR>代码是这样的<BR>Client:<BR>&nbsp;&nbsp;&nbsp;&nbsp;_RecordsetPtr pRs;<BR>&nbsp;&nbsp;&nbsp;&nbsp;IUnknown* pUn ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pDB-&gt;raw_GetRecordset2((IUnknown**)&amp;pUn); // pDB为先前CoCreateInstanceEx时得到的指针,通过该指针调用其他方法,如pDB-&gt;raw_GetRecordset1()可得到值,正常执行<BR>&nbsp;&nbsp;&nbsp;&nbsp;pRs.Attach((_Recordset*)pUn);<BR>Server:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetRecordset2(IUnknown** ppun)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_pRecSet-&gt;put_ActiveConnection(vtMissing);<BR>&nbsp;&nbsp;&nbsp;&nbsp;*ppun =reinterpret_cast&lt;IUnknown *&gt;(m_pRecSet.Detach());<BR>&nbsp;&nbsp;&nbsp;&nbsp;return S_OK;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR> m_pRecSet为类变量,已在构造函数中初始化,在GetRecordset1中使用时正常。<BR>在Client端执行GetRecordset2时已将GetRecordset1方法的调用注释掉了。<BR>以上代码有什么问题么?<BR>另外,在Server端掉用Clone方法是,运行出错,不知什么原因。<BR><BR>FirstHoward兄,可否把你的能正常执行的代码贴一下?我对VC不是很熟,有很多地方都不会写,比如Clone方法的调用,我的写法是:<BR>_RecordsetPtr pRs;<BR>pRs = m_pRecSet-&gt;Clone(adLockUnspecified);<BR>似乎不能正确执行。<BR><BR>万分感谢。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -