一个工程中我建立了两个atl对象:
CRecord
CDataset
在CDataset中提供一个接口:GetNext(),返回CRecord,怎么做?
-------------------
class ATL_NO_VTABLE CRecord :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CRecord, &CLSID_Record>,
public IDispatchImpl<IRecord, &IID_IRecord, &LIBID_HISDBPROVIDERLib>
{
public:
CRecord()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_RECORD)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CRecord)
COM_INTERFACE_ENTRY(IRecord)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()// IRecord
public:
STDMETHOD(get_m_strName)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_m_strName)(/*[in]*/ BSTR newVal);
STDMETHOD(get_m_strCode)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_m_strCode)(/*[in]*/ BSTR newVal);
STDMETHOD(get_m_strAddr)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_m_strAddr)(/*[in]*/ BSTR newVal);
private:
CString m_strAddr;
CString m_strCode;
CString m_strName;
//IPosition m_pos;
};#endif //__RECORD_H_
CRecord
CDataset
在CDataset中提供一个接口:GetNext(),返回CRecord,怎么做?
-------------------
class ATL_NO_VTABLE CRecord :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CRecord, &CLSID_Record>,
public IDispatchImpl<IRecord, &IID_IRecord, &LIBID_HISDBPROVIDERLib>
{
public:
CRecord()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_RECORD)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CRecord)
COM_INTERFACE_ENTRY(IRecord)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()// IRecord
public:
STDMETHOD(get_m_strName)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_m_strName)(/*[in]*/ BSTR newVal);
STDMETHOD(get_m_strCode)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_m_strCode)(/*[in]*/ BSTR newVal);
STDMETHOD(get_m_strAddr)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_m_strAddr)(/*[in]*/ BSTR newVal);
private:
CString m_strAddr;
CString m_strCode;
CString m_strName;
//IPosition m_pos;
};#endif //__RECORD_H_
在codeguru有个例子是在vb中通过列举每一个对象
for each record in dataset
list.add record.name
next
或者像
do while not dataset.eof
set record = dataset.getnext()
list.add record.name
dataset.movenext
loop
我在vc中通过atl建立com对象,怎么能够实现这个功能?
有没有例子或者相关资料?
在线等待!
{
....
}
关于脚本的更多信息,参见http://expert.csdn.net/Expert/topic/2464/2464391.xml
谢谢蒋晟和xiaohyy(醉大饿极)还有ForgottenRealm(lps)
昨天晚上奋斗结果:
声明了:
#include <vector>typedef vector<CComVariant,allocator<CComVariant> > HVECTOR;然后使用
HVECTOR *m_pvRecord;
然后实现的时候将组件对象加入这个容器.
如果客户端程序调用这个接口[如:Add(Record)----Record是COM组件的一个对象]
---------------------
STDMETHODIMP CDataset::AddNew(LPDISPATCH lpDisptch)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
//这里如何将lpDispatch 转换为CRecord??,是否需要判断?
//如果客户端传入的是其他的内容应该怎么处理?
CComObject<CRecord> *pRecord;
HRESULT hRes = CComObject<CRecord>::CreateInstance(&pRecord);
ATLASSERT(SUCCEEDED(hRes));
???
return S_OK;
}
可以到http://expert.csdn.net/Expert/topic/2540/2540734.xml?temp=.5139429
去,多多帮忙,先谢了,也谢谢楼主