我是通过MFC ClassWizard的Automation选项给COM接口添加方法,方法中的VARIANT指针类型的m_VariantParam参数用来接受从Access数据表中访问的记录集数组,m_VariantParam.vt=VT_ARRAY|VT_BSTR.     程序如下所示:BOOL CTransferParam::PassParam(LPCTSTR m_TableName, VARIANT FAR* m_ConstParam, BSTR FAR* m_SolidMorph, BSTR FAR* m_Materialty, VARIANT FAR* m_VariantParam) 
{
    ......    VariantInit(m_VariantParam);
    VariantInit(m_ConstParam);
    SAFEARRAYBOUND pSab[8];
    for(int i=0; i<8; i++)
    {
pSab[i].lLbound=0;
pSab[i].cElements=10;
}

m_VariantParam->vt=VT_ARRAY|VT_BSTR;
m_VariantParam->parray=SafeArrayCreate(VT_BSTR,8,pSab);

if(m_VariantParam->parray==NULL)
{
AfxMessageBox("SafeArrayCreate failed!");
AfxDaoTerm();
return FALSE;
}
    ......}在这种情况下,SafeArrayCreate()函数创建安全数组没问题,可是当我把数组维数
由8增加为20(或者更多)时,编译结果为不能创建安全数组。
请教各位大虾,是不是SafeArrayCreate()函数对于创建的数组维数有限制,又该如何解决这个问题呢?我要把一张数据表中的内容放到VARIANT类型的parray指针中去(记录大约有100多条),也就是数组维数需要100多维,该怎么办呢?
     请大家支个招吧,不胜感谢//bow and 3x.

解决方案 »

  1.   

    you only need ONE dimensional safearray,
    SAFEARRAYBOUND pSab[1];
    pSab[0].lLbound=0; 
    pSab[0].cElement = what you need
      

  2.   

    SAFEARRAY可以使用自定义的类型
    SafeArrayCreateEx的第一个参数为VT_RECORD时使用的是字定义的
    下面的代码就是从一个udt.dll获得自定义的类型然后并创建一个SAFEARRAY。
    udt.dll是一个COM 类DLL,在它的IDL文件中添加自定义类型的定义
    如下
    typedef[uuid(d4583575-33ad-4ad7-a7e0-dc30cf28fb15)]
    struct MyDataType
    {
       int x;
       int y;
       BSTR bstr;
    }MyDataType;下面是使用SAFEARRAY的代码,可供参考怎么把记录集放在SAFEARRAY里
    #include "stdafx.h"
    #include "atlbase.h"
    #include "..\udt.h"
    //d4583575-33ad-4ad7-a7e0-dc30cf28fb15
    int main(int argc, char* argv[])
    {
    USES_CONVERSION;
    VARIANT variant;
    ITypeLib *pTypeLib=0;
        HRESULT hr=::LoadTypeLibEx(L"..\\debug\\udt.dll",REGKIND_DEFAULT,&pTypeLib);
    ITypeInfo *pTypeInfo=0;
    const GUID GUID_MyDataType={0xd4583575,0x33ad,0x4ad7,0xa7,0xe0,0xdc,0x30,0xcf,0x28,0xfb,0x15};
    hr=pTypeLib->GetTypeInfoOfGuid(GUID_MyDataType,&pTypeInfo);
    pTypeLib->Release();
    IRecordInfo *pRecordInfo=0;
    hr=GetRecordInfoFromTypeInfo(pTypeInfo,&pRecordInfo);
    pTypeInfo->Release();
    SAFEARRAYBOUND pSab[1];//一维数组
    pSab[0].lLbound=0;
    pSab[0].cElements=4;
    SAFEARRAY *pSa=SafeArrayCreateEx(VT_RECORD,1,pSab,pRecordInfo);
    pRecordInfo->Release();
    MyDataType mydt[4];
    for(long  i=0;i<4;i++)
    {
    mydt[i].bstr=::SysAllocString(L"hello world");
    mydt[i].x=i;
    mydt[i].y=i*i;
    hr=SafeArrayPutElement(pSa,&i,(void *)&mydt[i]);
    }
    VariantInit(&variant);
    long a=VT_ARRAY|VT_RECORD;
        V_VT(&variant) = VT_ARRAY|VT_RECORD;
        V_ARRAY(&variant) = pSa;
        MyDataType my;
    /*for(i=0;i<4;i++)
    {
    hr=SafeArrayGetElement(pSa,&i,(void *)&my);
            printf("%d\n",my.y);
    }*/
    PVOID pvData;
    SafeArrayAccessData(pSa, &pvData);
    MyDataType * pTest;
    pTest = (MyDataType *)pvData;
    for(i=0;i<4;i++)
    printf("the %d: x=%d,y=%d,bstr=%s\n",i,pTest[i].x,pTest[i].y,OLE2T(pTest[i].bstr));
    SafeArrayUnaccessData(pSa); return 0;
    }