#21 如何让我的控件输出数组?
参阅如下代码:void CMyControl::GetArray( VARIANT FAR* pVariant )
{
//商业代码
int nCount = GetCount();
//定义维数
SAFEARRAYBOUND saBound[1];
//定义数组指针对性
SAFEARRAY* pSA; saBound[0].cElements = nCount;
saBound[0].lLbound = 0;
//创建数组
pSA = SafeArrayCreate( VT_BSTR, 1, saBound ); for( long i = 0; i < nCount; i++ )
{
BSTR bstr; //商业代码
bstr = GetItem( i ).AllocSysString();
//给数组赋值
SafeArrayPutElement( pSA, &i, bstr );
::SysFreeString( bstr );
} // 初始化传递的参数
VariantInit( pVariant ); //设置返值的类型为数组
pVariant->vt = VT_ARRAY | VT_BSTR;
pVariant->parray = pSA;
}
Visual Basic 代码: Dim t As Variant
Dim i as Integer MyControl1.GetArray t For i = 0 To MyControl1.Count - 1
ListBox.AddItem t( i )
Next i
参阅如下代码:void CMyControl::GetArray( VARIANT FAR* pVariant )
{
//商业代码
int nCount = GetCount();
//定义维数
SAFEARRAYBOUND saBound[1];
//定义数组指针对性
SAFEARRAY* pSA; saBound[0].cElements = nCount;
saBound[0].lLbound = 0;
//创建数组
pSA = SafeArrayCreate( VT_BSTR, 1, saBound ); for( long i = 0; i < nCount; i++ )
{
BSTR bstr; //商业代码
bstr = GetItem( i ).AllocSysString();
//给数组赋值
SafeArrayPutElement( pSA, &i, bstr );
::SysFreeString( bstr );
} // 初始化传递的参数
VariantInit( pVariant ); //设置返值的类型为数组
pVariant->vt = VT_ARRAY | VT_BSTR;
pVariant->parray = pSA;
}
Visual Basic 代码: Dim t As Variant
Dim i as Integer MyControl1.GetArray t For i = 0 To MyControl1.Count - 1
ListBox.AddItem t( i )
Next i
解决方案 »
- wchar_t 转 char* 的问题
- 请教:关于在VS2010下捕捉屏幕时不能捕捉VS2010的菜单问题,谢谢。
- VC怎么访问Access数据库?
- 字符串后如何加一个回车键
- 关于启动类属成员函数作线程执行体的问题
- LoadIcon
- 如何发送消息。 在线等............................................
- 怎样在新建word中加入文本,请高手指教!!!
- 一个PropertySheet中,能否让一个PropertyPage来关闭所有的窗口?如何实现?
- 回车问题
- 微软的工程师看过来,我找到了一个vc的bug!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 数字信号处理(语音和图象)寻武汉的兼职,精通windows编程,delphi或vc
例如从ASP中传进来的数值数组是8bit还是16bit还是32bit?
vt=VT_ARRAY ¦ VT_UI1;还是VT_I2还是VT_I4?
能否请您再详细说说。
STDMETHODIMP CAspTTT::Poly(VARIANT varPoint)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
SAFEARRAY *psa;
DWORD nChunkSize;
long cDim;
long * pNum;
DWORD nElemSize;
VARIANT *pvarData;
CFile m_File;
CString cs,cs1;
if(m_File.Open("D:\\log.txt",CFile::modeCreate|CFile::modeWrite))
{
cs=cs+"开始...";
cs1.Format("VarPoint.vt=%x...",varPoint.vt);
cs=cs+cs1; if(varPoint.vt == (VT_VARIANT | VT_BYREF))
{
cs=cs+"Variant|ByRef...";
pvarData = varPoint.pvarVal;
}
else
{
cs=cs+"not variant|Byref";
pvarData = &varPoint;
}
cs1.Format("pVarData->vt=%x...",pvarData->vt);
cs=cs+cs1;
cs1.Format("the VTARRAY_VT_I4=%x...\n", VT_ARRAY|VT_I4 );
cs=cs+cs1; cs1.Format("the VTARRAY_VT_I2=%x...", VT_ARRAY|VT_I2) ;
cs=cs+cs1;
cs1.Format("VT_I4 | VT_BYREF=%X...",VT_I4 | VT_BYREF);
cs=cs+cs1;
if(pvarData->vt == (VT_ARRAY|VT_R4))
{
cs=cs+"VT_R4";
} if(pvarData->vt == (VT_ARRAY|VT_I4))
{
cs=cs+"VT_I4";
} if(pvarData->vt == (VT_ARRAY|VT_I2))
{
cs=cs+"VT_I2";
}
psa = pvarData->parray;
cDim = ::SafeArrayGetDim(psa);
cs1.Format("cDim1=%d...",cDim);
cs=cs+cs1;
cs1.Format("cEle=%d...", psa->rgsabound[0].cElements);
cs=cs+cs1;
if(pvarData->vt == (VT_ARRAY|VT_INT))
{
//m_File.Write("VT_INT",6) ;
SafeArrayAccessData(psa, (void**)&pNum);
ai.m_lFontSize=*pNum;
pNum++;
ai.m_bFontBold =*pNum;
SafeArrayUnaccessData(psa);/*
//if(cDim == 1)
{
pNum=
nElemSize = ::SafeArrayGetElemsize(psa);
nChunkSize = psa->rgsabound[0].cElements * nElemSize;
::SafeArrayLock(psa);
long * l_Num=NULL;
l_Num=(long *)psa->pvData;
ai.m_lFontSize=*l_Num;
l_Num++;
ai.m_bFontBold =*l_Num;
::SafeArrayUnlock(psa);
}
*/
}
m_File.Write(cs,cs.GetLength());
m_File.Write("结束...",8);
m_File.Close(); }
return S_OK;
}
log.txt内容
开始...VarPoint.vt=400c...Variant|ByRef...pVarData->vt=600c...the VTARRAY_VT_I4=2003...
the VTARRAY_VT_I2=2002...VT_I4 | VT_BYREF=4003...cDim1=1280...cEle=4558580...结束...