• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 一com组件如何调用另外一com组件接口返回的recordeset对象问题

一com组件如何调用另外一com组件接口返回的recordeset对象问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了com组件接口,com组件对象模型,com组件,com组件是什么,com组件下载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 一com组件如何调用另外一com组件接口返回的recordeset对象问题
描述:

上一个帖子边城浪子帮忙回复了,但我的问题还是没解决好,具体情况如下:
------------------------------
关于com组件有个返回recordset对象问题想请教一下
具体问题是这样的:
(1)首先,封装了一个名称DbConn的组件,实现数据库链接管理,执行sql语句并且
返回结果,其中一个接口如下:
 
// 接口:GetRecordset
// 作用:执行数据访问高层构建sql语句,返回Recordset对象 
// 参数:strSql,高层构建sql语句
// 返回:Recordset/NULL
 
STDMETHODIMP CDbConn::GetRecordset(BSTR strSql, IDispatch **RS)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())
 
 _ConnectionPtr pCN;
 _RecordsetPtr pRS;
 _variant_t vtEmpty;
 
 char chrsql[200];
 HRESULT hr;
 try
 {
  hr = pCN.CreateInstance(__uuidof(Connection));
 
//字符转化
if(SUCCEEDED(hr))
  {
   for(int i=0;strSql[i]!=0;i++)
   {
    chrsql[i] = (char)strSql[i];
   }
   chrsql[i] = 0;
 
   hr = pCN->Open("DRIVER={MySQL ODBC 3.51
Driver};SERVER=localhost;DATABASE=test;UID=root;PWD=;","","",adModeUnknown);
   pRS = pCN->Execute(chrsql,&vtEmpty,adCmdUnknown);
   pRS->QueryInterface(IID_IDispatch,(void**)RS);
   return S_OK;
  }
 
 }
 catch(_com_error e)
 {
  return S_OK;
 }
 
 return S_OK;
}
 
此接口返回recordset对象,已经直接通过asp测试调用成功,现在问题如下:
 
我要中间设计一业务逻辑com组件,名称为DbAlert,提供给asp接口,根据上层asp业
务模块在这个com中构建数据库访问逻辑sql语句,处理返回recordset对象
 
此com组件DbAlert调用GetRecordset接口,获取recordset对象直接返回给asp,
或者处理获得的recordset后,返回某些数值给asp,请问这个组件怎么写??如何获得
recordset对象
访问底层com组件,把recordset传递给上一层,此接口程序如何写?谢谢了
我的MSN、Email:aliang.cn@gmail.com


解决方案1:

昨天你问的那个吧,  我的测试了, 很好
两个COM, 
Inner -- COM, 内层实现. 访问Access 返回Recordser 
Outer -- COM, 外层实现, 访问Inner 返回 Recordser ( 内部可以对 Recordset 进行操作,已经得到记录集)
调用1)  MFC 对话框 工程, 调用 Outer, 返回记录集,并显示出来
调用2)  ASP 脚本
-------------------------------------------------------------------
Inner: IDBConn接口实现
-------------------------------------------------------------------
STDMETHODIMP CDBCon::GetRecordset(BSTR strSQL, IDispatch **rset)
{
// TODO: Add your implementation code here
*rset = NULL;
_RecordsetPtr   rs;
_ConnectionPtr  conn;
if(FAILED(conn.CreateInstance("ADODB.Connection")))
{
return E_FAIL;
}
try
{
const char* connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\\XXX\\PHDebug.mdb";
conn->Open(connstr, "", "", adCreateNonCollection);
rs = conn->Execute(strSQL, NULL, adCmdText);
return rs->QueryInterface(IID_IDispatch, (void**)rset);
}
catch(_com_error& ce)
{
return ce.Error();
}
return S_OK;
}
------------------------------------------------------------------
Outer : IProc Interface
-------------------------------------------------------------------
#import "F:\MyProject\krh\test\atl\Record\Inner\Debug\Inner.DLL"  no_namespace
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
/////////////////////////////////////////////////////////////////////////////
// CProc
STDMETHODIMP CProc::DoQuery(BSTR strSQL, IDispatch **pRS)
{
// TODO: Add your implementation code here
*pRS = NULL;
IDBConPtr   db;
if(FAILED(db.CreateInstance("Inner.DBCon")))
{
return E_FAIL;
}
try
{
IDispatchPtr disp = db->GetRecordset(strSQL);
_RecordsetPtr  rs(disp);
//p->Release();
if(rs->EndOfFile)
{
}
else
{
}
*pRS = disp.Detach();
}
catch(_com_error& ce)
{
return ce.Error();
}
return S_OK;
}
------------------------------------------------------------
MFC Dialog  Caller (With COM Smart Point) :
-----------------------------------------------------------
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#import "F:\MyProject\krh\test\atl\Record\Outer\Debug\Outer.dll"  no_namespace
...
IProcPtr  ptr;
if(SUCCEEDED(ptr.CreateInstance("Outer.Proc")))
{
try{
_RecordsetPtr  p = ptr->DoQuery("SELECT * FROM t_user");
//p->Release();
while(!p->EndOfFile)
{
AfxMessageBox((_bstr_t)p->GetCollect("uid"));
p->MoveNext();
}
}
catch(_com_error& ce)
{
long e =  ce.Error();
AfxMessageBox(CString("ERROR : ") + (const char*)(_bstr_t)_variant_t(e));
}
---------------------------------------------------------
ASP Script Caller :
-----------------------------------------------------------
<%
set obj = Server.CreateObject("Outer.Proc")
set rst = obj.DoQuery("SELECT * from t_user")
response.Write "<table border=1 bordercolor=red><tr><td> user ID</td><td> name 
</td></tr>"
do while not rst.EOF
response.Write "<tr><td>" + rst.Collect("uid") + "</td><td>"+ 
rst.Collect("name")+"</td></tr>"
rst.MoveNext
loop
response.Write "</table>"
set rst = nothing
%>


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 怎样定义接口,使com组件能够返回一个二进制的流(比如图片数据)
  • 那个接口能在COM组件中实现可控制的定时器?
  • 如何将现有的项目,加些接口,变成进程外组件?
  • 服务组件的接口住息
  • 组件实现什么接口,可以读取或设置到IE的打印设置内容?
  • 初学COM,征集方案:你会怎么设计下面的组件和接口?
  • com组件能不能引出继承来的父接口?
  • 如何在COM组件中添加设置回调函数的接口?
  • 如何将COM+组件的接口方法设置为只能被COM+应用程序内部使用?
  • 关于组件接口的应用问题

相关文章

  • 2017-06-04 一个Debug不出错而Release却出错的奇异问题
  • 2017-06-05 请问有的dll带有lib,有的还带有h,到底是怎么回事啊?分别怎么使用啊?
  • 2017-06-05 请问能否做到程序的自启动??,或者关闭某个程序让他再启动??谢谢
  • 2017-06-05 关于vc编译器的设定问题
  • 2017-06-05 如何在OCX里面定义事件并提供给javascript响应
  • 2017-06-05 散分!求多线程书籍下载。
  • 2017-06-04 对COM和ATL有所了解后,如何学习IE编程?
  • 2017-06-05 在DLL中能添加自己定义的类吗,为什么我在DLL调用中调用类的函数总出错呀,救救我!!
  • 2017-06-04 _bestr_t如何转换TCHAR?
  • 2017-06-05 关于如何调用dll的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请推荐款高清摄像头
    • 在线程中可以创建一个对话框吗?
    • 有谁有比较全面的关于进程通信的知识?
    • 服务中启动进程的问题
    • 消息定义及映射
    • 做好的activex控件如何打包成cab文件?
    • 用MAPX和ASP可以做WEBGIS么?
    • ATL70中如何获取资源句柄
    • 关于安装directx问题?为什么我安装的DirectX没有directshow
    • 关于duplicatehandle,请教!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有