我用vc的atl com wizard写了一个基于ado的com,主要用做php连接到数据库的中间操作。
但是用这种方法写的com,在里面加方法的时候,很多函数不能被识别(编译的时候出错,例如CString类型,说不识别,replace这个api函数也用不了)怎样解决
(用这种方法写的类不是从mfc继承下来的,而我又想使用一些api函数,该include进来些什么文件呢?怎样确定某个api函数需要什么样的include文件)谢谢
但是用这种方法写的com,在里面加方法的时候,很多函数不能被识别(编译的时候出错,例如CString类型,说不识别,replace这个api函数也用不了)怎样解决
(用这种方法写的类不是从mfc继承下来的,而我又想使用一些api函数,该include进来些什么文件呢?怎样确定某个api函数需要什么样的include文件)谢谢
最简单的方法:在生成向导中选中支持MFC,
要不也可以使用WTL,它也提供了一个CString类
mfc!=api
要加入api,只要include 头文件,有时候还有加入lib就可以了,具体要哪个头文件和lib,参考msdn
要支持mfc,在stdafx.h中加入afx.h,在project setting->general中选择using mfc in static dll or using mfc in shared dll就可以了
现在我需要返回值,即一个数据集,应该怎样写
STDMETHODIMP CMaster::OpenRecordset1(VARIANT query)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
VARIANT v;
V_VT(&v) = VT_DISPATCH;
V_DISPATCH(&v) = (IDispatch*) m_connection;
V_DISPATCH(&v)->AddRef();
return m_recordset->Open(query, v, adOpenDynamic, adLockOptimistic, adCmdText);}
应该在idl里定义为:
OpenRecordset1(/*[in]*/VARIANT query,/*[out,retval]*/IDispath* pRecordset)
我如此做了
可是编译的时候根本过不去
不知道precordset应该怎样得到m_recordset->Open(query, v, adOpenDynamic, adLockOptimistic, adCmdText)的记录集
我用rs=m_recordset->Open(query, v, adOpenDynamic, adLockOptimistic, adCmdText)
出错
怎样让函数的返回值是数据集类型
记录集指针类型:_RecordsetPtr m_Recordsetm_Recordset = m_Connection->Execute
(_bstr_t(SQL),&RecordsEffected,adCmdText);
IDL中的定义为:
[in, string] BSTR CompeteID, [out, retval] LPDISPATCH * ppRecordSet
函数原型为:
STDMETHOD(GetRowByGroupID)(BSTR GroupID, LPDISPATCH * ppRecordSet);
实现为:_RecordsetPtr prsT1;
prsT1 = m_pCmd->Execute(&vntRecordsAffected, NULL, adCmdText);//不管怎么样,只要你得到记录集就可以了。
prsT1->QueryInterface(IID_IDispatch, (void**) ppRecordSet); //这才是最重要的一步,它才是返回的东西客户调用时:直接定义一个
_RecordsetPtr prsT2;prsT2 = Obj.method(para);
就可以了;