我用vc的atl com wizard写了一个基于ado的com,主要用做php连接到数据库的中间操作。
但是用这种方法写的com,在里面加方法的时候,很多函数不能被识别(编译的时候出错,例如CString类型,说不识别,replace这个api函数也用不了)怎样解决
(用这种方法写的类不是从mfc继承下来的,而我又想使用一些api函数,该include进来些什么文件呢?怎样确定某个api函数需要什么样的include文件)谢谢

解决方案 »

  1.   

    CString是MFC的东西,默认情况下当然不能使用
    最简单的方法:在生成向导中选中支持MFC,
    要不也可以使用WTL,它也提供了一个CString类
      

  2.   

    基本的概念没搞清楚,估计是直接wizard上路的,没写过dos程序,也没写过winmain的程序
    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就可以了
      

  3.   

    这是我在用atl com wizard建立的com中加的一个方法,只有传入值,没有传出值
    现在我需要返回值,即一个数据集,应该怎样写
    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);}
      

  4.   

    如果要返回值的话
    应该在idl里定义为:
    OpenRecordset1(/*[in]*/VARIANT query,/*[out,retval]*/IDispath* pRecordset)
      

  5.   

    wangfei_x(wangfei) 
    我如此做了
    可是编译的时候根本过不去
    不知道precordset应该怎样得到m_recordset->Open(query, v, adOpenDynamic, adLockOptimistic, adCmdText)的记录集
    我用rs=m_recordset->Open(query, v, adOpenDynamic, adLockOptimistic, adCmdText)
    出错
    怎样让函数的返回值是数据集类型
      

  6.   

    ado里面连接的数据类型:_ConnectionPtr m_Connection
    记录集指针类型:_RecordsetPtr m_Recordsetm_Recordset = m_Connection->Execute
    (_bstr_t(SQL),&RecordsEffected,adCmdText);
      

  7.   

    当com应用于其他平台时不能用CString来传递参数,必须用BSTR类型来传递字符串,详细资料可以参考MSDN,如果愿意得到详细解释,请给我写信,[email protected].
      

  8.   

    让函数的返回值是数据集类型:
    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);
    就可以了;