描述:
我想用ATL做一个组件,返回ADO的Recordset对象,给VB对象
方法的声明:HRESULT GetADORecordset([in] BSTR ConnString,[in] BSTR SQLString,[out,retval] IDispatch **RS);
方法的实现:
STDMETHODIMP CGetADO::GetADORecordset(BSTR ConnString, BSTR SQLString, IDispatch **RS)
{ _ConnectionPtr pCN;
_RecordsetPtr pRS;
_variant_t vtEmpty;
pCN.CreateInstance(__uuidof(Connection));
pCN->ConnectionString =ConnString;
pCN->Open("", "", "", -1);
pRS = pCN->Execute(SQLString, &vtEmpty, adCmdUnknown);
pRS->QueryInterface(IID_IDispatch,(void**) ptp->RS);
return S_OK;
}
用VB调用之后返回Recordset对象,但是这样不稳定,因为无法通知返回Recordset对象成功,因此需要用连接点来触发一个事件
连接点的方法声明:HRESULT OnGetADORecordset(IDispatch **RS);
原GetADORecordset改为:
STDMETHODIMP CGetADO::GetADORecordset(BSTR ConnString, BSTR SQLString)
{
_ConnectionPtr pCN;
_RecordsetPtr pRS;
_variant_t vtEmpty;
IDispatch **RS=NULL;
pCN.CreateInstance(__uuidof(Connection));
pCN->C />
pCN->Open("", "", "", -1);
pRS = pCN->Execute(SQLString, &vtEmpty, adCmdUnknown);
pRS->QueryInterface(IID_IDispatch,(void**)RS);
Fire_OnGetADORecordset(RS);
return S_OK;
}
这样VB调用之后没有触发OnGetADORecordset事件,Fire_OnGetADORecordset(RS);这句话不成功,是不是参数RS的类型有问题呢,还是什么原因,连接点的方法的参数如何传递对象,请教各位,谢谢。
解决方案1:
HRESULT Fire_OnGetADORecordset(IDispatch *RS)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[0] = RS;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}
Invoke函数中第一个参数的序号一定要与接口中的一致,如果接口中的数字为5,那么第一个参数为0x5,这样应该就可以了.
1.对于VB来说,它只能使用默认的接连点,并且只能有一个
在idl中有没有
dispinterface _IXXXEvents
{
properties:
methods:
}
[default,source] dispinterface _IXXXEvents;
并且
在ATL类中有没有
public IProvideClassInfo2Impl<&CLSID_GridCtrl, &__uuidof(_IXXXEvents), &LIBID_GridLib>,