我是通过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.
{
...... 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.
SAFEARRAYBOUND pSab[1];
pSab[0].lLbound=0;
pSab[0].cElement = what you need
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;
}