使用QueryInterface 出错?

uliser 2004-07-06 06:01:36
简单的接口参数调用。
Client端
#import "..\msado15.dll" no_namespace rename("EOF","adoEOF")
#import "..\myDll.dll" no_namespace
客户端调用myDll中的接口IDBMan的Test([in]LPSTR strSql,IUnknown* Record);
{
IDBManPtr myDB;
myDB.CreateInstance(__uuidof(myDll));
_RecordsetPtr myRecord;
myRecord.CreateInstance(__uuidof(Recordset));
myRecord->CursorLocation=adUseClient;
myDB->Test("select * from myTable",(IUnknown*)(&myRecord));
}


COM 端
STDMETHODIMP CDBOperator::Test(LPSTR strSql,IUnknown* Record)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

_RecordsetPtr pRecord;

pRecord.CreateInstance(__uuidof(Recordset));

Record->QueryInterface(pRecord.GetIID(),(void**)(&pRecord));//调用queryInterface时出错。

// pRecord->Open(strSql,(IDispatch*)m_pConnect,adOpenDynamic,adLockOptimistic,adCmdText);
//本段代码的本意是通过传过来的sql操作语句,和记录集对象,在COM中实现对记录集的统一执行,最终返回一结果记录集。
return S_OK;
}

//////////////////////////////////////////////////////////////////////
//程序的意图:
自已写一个接口,其主要是调用msado15.dll中的三个对数据库操作的接口,通过自已的方法,相当于一个公有模块,使客户端直接调用我的方法,即可得到对数据库的访问。且客户端不用导入msado15.dll,直接导入我的动态库即可,希望大家多给点方案及解决意见。
...全文
220 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
uliser 2004-07-22
  • 打赏
  • 举报
回复
访问接口并返回记录集成功)http://community.csdn.net/Expert/topic/3173/3173545.xml?temp=.9033777)

如果传过来的是记录集,COM中实现该记录集的移动操作,该如何操作呢?
名牌大灰狼 2004-07-14
  • 打赏
  • 举报
回复
pRecord.CreateInstance(__uuidof(Recordset));
uliser 2004-07-10
  • 打赏
  • 举报
回复
是客户端传参数不正确吗?
给推荐几个COM朋友吧,太没有成就感了。
我的EMAIL:uliser@163.com
uliser 2004-07-07
  • 打赏
  • 举报
回复
hr=pRecord.CreateInstance(__uuidof(Recordset));
hr返回0。
uliser 2004-07-07
  • 打赏
  • 举报
回复
不是,返回pRecord{0x02930e98}
zoid 2004-07-07
  • 打赏
  • 举报
回复
com端:
pRecord.CreateInstance(__uuidof(Recordset));
pRecord返回是否NULL?
uliser 2004-07-07
  • 打赏
  • 举报
回复
Client 端

void CClientDlg::OpenRecord()
{
try
{
IDBManPtr myTest;
myTest.CreateInstance(__uuidof(myDll));
_RecordsetPtr Record;
Record.CreateInstance(__uuidof(Recordset));
myTest->Show("select * from Table",(IUnknown**)&Record);
}
catch(_com_error err)
{
AfxMessageBox((char*)err.Description());
}
catch(...)
{
AfxMessageBox("不能原谅的错误");
}
}

COM 端
STDMETHODIMP CDBOperator::Test(LPSTR strSql,IUnknown** Record)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

HRESULT hr;

_RecordsetPtr pRecord=NULL;

pRecord.CreateInstance(__uuidof(Recordset));

hr=(*Record)->QueryInterface(pRecord.GetIID(),(void**)(&pRecord));
//程序走到此处便直接跳到 --> AfxMessageBox("不能原谅的错误");

if(FAILED(hr))
...
}
wangweixing2000 2004-07-07
  • 打赏
  • 举报
回复
STDMETHODIMP CDBOperator::Test(LPSTR strSql,IUnknown** Record) //这里
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
HRESULT hr = S_OK;
_RecordsetPtr pRecord = NULL;

hr = pRecord.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
{
....
}
else
{
hr = Record->QueryInterface(pRecord.GetIID(),(void**)(pRecord));
if(FAILED(hr))
{
......
}
else
{
pRecord->Open(strSql,(IDispatch*)....
}
}
return S_OK;
}
uliser 2004-07-07
  • 打赏
  • 举报
回复
2.3.代理接口(Proxy Interface)

从指向接口的指针本身来看,指向接口的指针是指向VPTR的指针,而VPTR指向VTBL,所以可以认为指向接口的指针间接指向VTBL。从逻辑上看,可以认为接口(逻辑接口,不是抽象类)就是一组指向方法的指针的集合,以实现调用的运行时绑定。

对象引出指向接口的指针,从逻辑上看,可以认为是对象引出接口。任何应用程序,只要实现VTBL数据结构和VPTR数据结构,同时实现VTBL中的每一项(指向虚函数的指针)指向的虚函数,就都可以让指向接口的指针指向VPTR,也就是说都可以引出指向接口的指针,不一定只有对象才能引出指向接口的指针,从逻辑上看,可以认为任何应用程序都可以引出接口。

如果对象引出指向接口的指针,但是对象和调用者不在同一位置(例如不在同一地址空间,甚至不在同一计算机上),那么指向接口的指针和调用者就也不在同一位置,那么如何让调用者通过对象引出的指向接口的指针调用接口的方法呢?

可以使用一个和调用者在同一位置,引出指向相同接口的指针的应用程序,该应用程序实现的接口的方法,完成通过通道(Channel),越过不同位置的边界,通过对象引出的指向接口的指针调用接口的方法,这个应用程序称为代理(Proxy),引出的指向相同接口的指针称为指向代理接口(Proxy Interface)的指针,从逻辑上看,可以认为是代理引出代理接口。调用者可以使用相同的方法,通过代理引出的指向代理接口的指针调用接口的方法。

调用者使用代理引出的指向代理接口的指针代替对象引出的指向接口的指针,相当于对象引出的指向接口的指针被调整(Marshal)成了代理引出的指向代理接口的指针。对象引出的指向接口的指针可以认为是对象的引用(直接引用),那么代理引出的指向代理接口的指针也可以认为是对象的引用(间接引用)。

调用者使用通过对象引出的指向接口的指针调用接口的方法,从逻辑上看,可以认为是调用者使用接口。使用代理和指向代理接口的指针,可以保证无论对象和调用者是否在同一位置,通过指向接口的指针调用接口的方法的方法都一致,这称为位置透明性(Location Transparency)或者位置无关性,从逻辑上看,可以认为位置透明性相当于调用者使用的接口和对象可以不在同一位置,无论对象位于什么位置,调用者使用的接口(或者代理接口)的位置都相同,调用者使用接口(或者代理接口)的方法也都相同。

uliser 2004-07-07
  • 打赏
  • 举报
回复
代理接口是什么呢?
msado15.dll中有我需要用到的三个接口:
{_ConnectionPtr,_RecordsetPtr,_CommandPtr}
我想把调用msado15.dll中的接口的方法封装到自已写的myDB.dll中,
比如:{
OpenConnect([in]LPSTR strConnect);
ExecMySql([in]LPSTR strSql,[out]IUnknown* myRecord);
}
但是客户端也同样要有一个记录集对象来保存记录集,我又想只导入一个myDB.dll直接使用,是不是myDB.dll就相当于一个代理接口?代理接口到底是什么呢,它跟被代理之间的多个接口是什么对应关系(如果有无知的话,或我的意思没表达清楚,请愿谅,并请给我指出来)
uliser 2004-07-07
  • 打赏
  • 举报
回复
程序走到Record->QueryInterface(pRecord.GetIID(),(void**)(&pRecord));
就直接退出,而且用catch(_com_error err),捕获不到错误,用catch(...)能。
--------------------------------------------------------------------
你能给我一个最简单的IUnknown* 参数的调用吗
zoid 2004-07-06
  • 打赏
  • 举报
回复
程序不够严谨,没有错误判断,
有关com的操作,应该加入HRESULT hr=...;判断返回值再进行下一步操作.
你出的是什么错误?

3,245

社区成员

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

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