例如:
---------------------------------------------
//Cxxx类中设置myArray接受属性输入
private:
  vector<CString> myArray;
//属性get函数该怎么写?
STDMETHODIMP Cxxx::get_ArrayPro(VARIANT *pVal)
{
  return S_OK;
}
//属性put函数该怎么写?
STDMETHODIMP Cxxx::putref_ArrayPro(VARIANT newVal)
{
  return S_OK;
}

解决方案 »

  1.   

    Wizard里面都没有SAFEARRAY这种类型,即使写了这个类型之后,点击Add Property to Interface窗口OK后没有反应
      

  2.   

    private:
      vector<CString> myArray;  // 楼主这里混合了 MFC,SLT和 ATL, 呵呵,建议不要这样
    //属性get函数该怎么写?
    STDMETHODIMP Cxxx::get_ArrayPro(VARIANT *pVal)
    {
      pVal->vt = VT_ARRAY|VT_BSTR;
      SAFEARRAYBOUND rgsabound[1];
      rgsabound[0].lLbound = 0;
      rgsabound[0].cElements  = myArray.size();
      chunk->parray = SafeArrayCreate(VT_BSTR, 1, rgsabound);
      BSTR* pBuf = 0;
      SafeArrayAccessData(chunk->parray, (void**)&pBuf);
      for(int i = 0; i < myArray.size(); ++i)
         pBuf[i] = myArray[i].SysAllocString();
      SafeArrayUnaccessData(chunk->parray);
      return S_OK;
    }
    //属性put函数该怎么写?
    STDMETHODIMP Cxxx::putref_ArrayPro(VARIANT newVal)
    {
      if(newVal.vt != (VT_ARRAY|VT_BSTR)) E_INVALIDARG;  // 无效的参数类型
      BSTR* pData = 0;
      SafeArrayAccessData(newVal.parray, (void**)&pData);
      myArray.clear();
      int iSize = SafeArrayGetElemsize(newVal.parray)
      USES_CONVERSION;
      for(int i = 0; i < iSize; ++i)
          myArray.push_back(CString(OLE2CA(pData[i])))
      SafeArrayUnaccessData(newVal.parray);
      return S_OK;
    }
    随手写的, 不知道写得对不对. 大致原理也就是这样了, 楼主自己调试下
      

  3.   

    vector<CString> myArray;  // 楼主这里混合了 MFC,SLT和 ATL, 呵呵,建议不要这样我原本的设计甚至更复杂
    vector<MyStruct> myArray;   //MyStruct是一个包含CString申明字串的结构体我对ATL设计没有经验,我发现自己很容易就走入了ATL+STL+MFC的组合,我本身是很不情愿用MFC不知道这三者的混合有什么不好,或者我应该采取其他更好的做法?(事实上当前我只用到了MFC的CString,但是工程引入了一个依赖MFC的Lib,所以我以为加上MFC会方便些)
      

  4.   

    vector<CString> myArray; 
    这个用法本身 应该没什么问题. 你再检查调试一下