我做的一个activex控件。其中有一个接口类的的一个属性要
得到内部的一个字符串数组,其实就是CStringArray类的一个对象。
或者是
200,300,200,300
100,200,200,200
这种数组,比如上面的数组是两个元素,第一个是
“200,300,200,300”第二个是“100,200,200,200”
我现在就是想把他们(接口类的一个内部变量,属性)得到。当然要通过
属性来得到了。不知道应该怎么得到啊?用什么类型返回啊?
VARIANT吗??还是别的什么啊?比如SAFEARRAY啊??要求得到以后在vb中,比如上面那个例子,可以定义一个数组A
A(0) = “200,300,200,300”
A(1) = “100,200,200,200”
请大家多帮忙,谢谢了。

解决方案 »

  1.   

    VARIANT
    VARIANT中的数据类型是SAFEARRAY,SAFEARRAY中的数据为VT_BSTR。
      

  2.   

    属性页要和程序关联起来是这样做的。
    void CXXXPropPage::DoDataExchange(CDataExchange* pDX)
    {
    //{{AFX_DATA_MAP(CDbGridPropPage)
    DDP_Check(pDX, 属性页的控件名, 根控件关联的变量, _T("程序中此属性的名字(他和一个on属性名change关联)") );
    DDX_Check(pDX, 属性页的控件名, 根控件关联的变量);
    //}}AFX_DATA_MAP
    DDP_PostProcessing(pDX);
    }
      

  3.   

    对啊,我是用得你说说得这个方法啊。
    VARIANT
    VARIANT中的数据类型是SAFEARRAY,SAFEARRAY中的数据为VT_BSTR。
    可是结果不对,总是有runtime error
    是不是因为内存分配不是在堆里申请得啊??(pTmpResultArray可以看出一个矩阵,n×4的,所以要动态分配才行)STDMETHODIMP CclsDivideCard::get_pResultArray(VARIANT *pVal)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
    UINT i = 0;
    CString A;
    VARIANT var;
    BSTR HUGEP *pbstr = NULL;
    HRESULT hr;
    SAFEARRAY * psa;
    SAFEARRAYBOUND rgsabound[1];
    if ((gblOKDoneDivide) && (pTmpResultArray.GetC() > 0) && (pTmpResultArray.GetR() > 0))
    {
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = pTmpResultArray.GetR();
    psa = SafeArrayCreate(VT_BSTR, 1, rgsabound);
    if (psa == NULL)
    {
    return NOERROR;
    }
    hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
    if (FAILED(hr))
    return NOERROR;
    for (i = 0; i < psa->rgsabound[0].cElements - 1; i++)
    {
    A.Empty();
    A.Format("%d,\t%d,\t%d,\t%d", (int)pTmpResultArray.GetAt(i + 1, 1),
    (int)pTmpResultArray.GetAt(i + 1, 2),
    (int)pTmpResultArray.GetAt(i + 1, 3),
    (int)pTmpResultArray.GetAt(i + 1, 4));
    pbstr[i] = A.AllocSysString();
    }
    SafeArrayUnaccessData(psa);
    pVal->vt = VT_ARRAY | VT_BSTR;
    pVal->parray = psa;
    // var.vt = VT_ARRAY | VT_BSTR;
    // var.parray = psa;
    // COleVariant* t = new COleVariant;
    // t->Attach(var);
    // *pVal = t->Detach();
    }
    else
    {
    }
    return S_OK;
    }