描述:
有一个已有的COM (msado15.dll)
我想做一个msado15.dll的代理COM,
interface IDemoOuter : IDispatch
{
HRESULT OpenConnect([in]LPSTR strConnect);
HRESULT ExecuteSql([in]LPSTR str/*要执行的SQL语句*/,[out] IUnknown *pUnk/*记录集对象*/);
}
//实现
STDMETHODIMP CDemoOuter::ExecuteSql(LPSTR strSql, IUnknown *pUnk)
{
pUnk=m_pUnkRecord;
_RecordsetPtr LocalRecord;
HRESULT hr=m_pUnkRecord->QueryInterface(LocalRecord.GetIID(),(void**)&LocalRecord);
if(FAILED(hr))
return NULL;
hr=LocalRecord->Open(strSql,(IDispatch*)m_pConnect,adOpenDynamic,adLockOptimistic,adCmdText);
//此处的LocalRecord不是代表传过来的记录集对象吗?
return hr;
}
STDMETHODIMP CDemoOuter::OpenConnect(LPSTR strConnect/*连接串*/)
{
HRESULT hr=m_pConnect.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
return NULL;
try
{
hr=m_pConnect->Open((_bstr_t)strConnect,"","",adConnectUnspecified);
return hr;
}
catch(_com_error err)
{
CloseConnect();
return NULL;
}
}
//客户端调用
//打开表
void CTestDlg::OnOpenTable()
{
try{
_RecordsetPtr m_Record;
HRESULT hr=m_Record.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
return;
myDB->put_DBRecord((IUnknown*)&m_Record);
myDB->ExecuteSql("select * from T1",(IUnknown*)&m_Record);
myDB->get_DBRecord((IUnknown**)&m_Record);
//以下略,显示m_Record的记录结果
//m_Record=0x0000000...
}
catch(_com_error err)
{
AfxMessageBox((char*)err.Description());
}
catch(...)
{
AfxMessageBox("无法捕获的错误(table)");
}
}
//最终目的,客户端得到记录集
//希望高手帮忙,QQ:360893574
解决方案1:
GetAgencyInfo([in] BSTR LogName, [out,retval] IDispatch **info)
STDMETHODIMP CCustomer::GetAgencyInfo(BSTR LogName, IDispatch **info)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
char sql[SQL_BUFFER];
sprintf(sql,"SELECT * FROM Agency WHERE ID IN(SELECT PID FROM Customer WHERE Customer.LogName=\'%s\')",B2S(LogName));
_RecordsetPtr pRecordSet=NULL,pRecordSetCl />
try {
pRecordSet.CreateInstance(__uuidof(Recordset));
pRecordSet->CursorLocation = adUseClient;
pRecordSet->Open(sql,szConnectString,adOpenKeyset,adLockOptimistic,adCmdText);
pRecordSet->PutRefActiveConnection(NULL);
pRecordSetClone = pRecordSet->Clone(adLockOptimistic);
pRecordSetClone->QueryInterface(IID_IDispatch, (void**)info);
pRecordSet->Close();
pRecordSet = NULL;
} catch ( _com_error &e ) {
_bstr_t wszSource(e.Source());
_bstr_t wszDescription(e.Description());
_bstr_t wszErrorMessage(e.ErrorMessage());
ATLTRACE(_T("%s\n"), (LPCTSTR)wszSource);
ATLTRACE(_T("%s\n"), (LPCTSTR)wszDescription);
ATLTRACE(_T("%s\n"), (LPCTSTR)wszErrorMessage);
}
return S_OK;
}
您可能想查找下面的文章:
- ATL项目中怎样建立继承于IUnknown的没有任何实现的基接口?
- 关于IUNKNOWN的QueryInterface的实现问题
- IUnknown作参数时怎么传参?
- COM聚合时候对IUnknown有两个不同的实现
- 继承IUnknown的接口,为什么在VB对象浏览中还是能看到?
- IUnknown的Addref/release功能都类似,为什么还要用户去实现?
- 接口在对IUnknown的继承过程中为什么不使用虚继承?
- 请问怎么通过进程ID获得IUnknown接口?
- 怎样理解“IUnknow即没有数据也没有函数,我们仅仅继承了接口”?IUnknown不是有3个函数声明吗?
- 我做了一个ActiveX控件,在客户程序的函数中需要此控件的IUnknown做为参数,调用GetIDispatch()函数总出错,该怎么办?