如何从safearray(变体数组)提取多维数据?

alphawin 2003-10-15 10:11:41
如题!急!!
...全文
103 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxfBrave 2003-10-15
  • 打赏
  • 举报
回复
BOOL CVCondlg::TransVarToBuf(VARIANT& var, LPBYTE lpBuf, int nBufLen)
{
LPBYTE lpVarBuf = NULL;

if ( (NULL != var.parray)
&& (var.vt == (VT_ARRAY | VT_UI1))
&& (1 == SafeArrayGetDim(var.parray))
)
{
// Validate the buffer bounds
long UpperBounds;
long LowerBounds;

SafeArrayGetLBound(var.parray, 1, &LowerBounds);
SafeArrayGetUBound(var.parray, 1, &UpperBounds);

if ((LowerBounds == 0) && (UpperBounds >= nBufLen - 1))
{
SafeArrayAccessData(var.parray, (void* *)&lpVarBuf);

memcpy(lpBuf, lpVarBuf, nBufLen);

SafeArrayUnaccessData(var.parray);

return TRUE;
}
}

return FALSE;
}
catcafee 2003-10-15
  • 打赏
  • 举报
回复
一下有一段代码你参考一下
//设置线的点,并且画线
short CCYTLineCtrl::SetLine(const VARIANT FAR& varLine)
{
// TODO: Add your dispatch handler code here
DeleteAll();
/* switch(varLine.vt )
{
case VT_UI1:
AfxMessageBox("I1");
break;
case VT_I2:
AfxMessageBox("I2");
break;
case VT_I4:
AfxMessageBox("I4");
break;
case VT_ARRAY :
AfxMessageBox("Arr");
break;
case VT_BYREF|VT_UI1:
AfxMessageBox("ArrI1");
break;
case VT_BYREF|VT_I2:
AfxMessageBox("arri2");
break;
case VT_EMPTY:
AfxMessageBox("error");
break;
case VT_BYREF|VT_DISPATCH:
AfxMessageBox("arrDis");
break;
case VT_BYREF|VT_UNKNOWN:
AfxMessageBox("arrUnk");
break;
case VT_BYREF|VT_BSTR:
AfxMessageBox("arrBS");
break;
case VT_BYREF|VT_DATE:
AfxMessageBox("arrDate");
break;
case VT_BYREF|VT_CY:
AfxMessageBox("arrCY");
break;
case VT_BYREF|VT_ERROR:
AfxMessageBox("arrErr");
break;
case VT_BYREF|VT_I4:
AfxMessageBox("arrI4");
break;
//case VT_BYREF|VT_I2:
// AfxMessageBox("arrI2");
// break;
case VT_VARIANT | VT_BYREF:
AfxMessageBox("arrByte");
break;
}
VARIANT *ppVar=varLine.pvarVal ;
switch(ppVar ->vt )
{
case VT_UI1:
AfxMessageBox("I1");
break;
case VT_I2:
AfxMessageBox("I2");
break;
case VT_I4:
AfxMessageBox("I4");
break;
case VT_ARRAY :
AfxMessageBox("Arr");
break;
case VT_BYREF|VT_UI1:
AfxMessageBox("ArrI1");
break;
case VT_BYREF|VT_I2:
AfxMessageBox("arri2");
break;
case VT_EMPTY:
AfxMessageBox("error");
break;
case VT_BYREF|VT_DISPATCH:
AfxMessageBox("arrDis");
break;
case VT_BYREF|VT_UNKNOWN:
AfxMessageBox("arrUnk");
break;
case VT_BYREF|VT_BSTR:
AfxMessageBox("arrBS");
break;
case VT_BYREF|VT_DATE:
AfxMessageBox("arrDate");
break;
case VT_BYREF|VT_CY:
AfxMessageBox("arrCY");
break;
case VT_BYREF|VT_ERROR:
AfxMessageBox("arrErr");
break;
case VT_BYREF|VT_I4:
AfxMessageBox("arrI4");
break;
//case VT_BYREF|VT_I2:
// AfxMessageBox("arrI2");
// break;
case VT_VARIANT | VT_BYREF:
AfxMessageBox("arrByte");
break;
case VT_R4:
AfxMessageBox("R4");
break;
case VT_R8:
AfxMessageBox("R8");
break;
}*/
VARIANT *ppVar=varLine.pvarVal ;
SAFEARRAY *pSafe=NULL;
pSafe=ppVar->parray ;
if(pSafe==NULL) return 0;
long uBound=0;
SafeArrayGetUBound(pSafe,1,&uBound);
VARIANT *pvar=NULL;
SafeArrayLock(pSafe);
pvar=(VARIANT*)pSafe->pvData ;
SafeArrayUnlock(pSafe);
USES_CONVERSION;
CString strPoint;
CComBSTR bstr;
VARIANT var;
SAFEARRAY* pSafevar=NULL;
//VARIANT *pVal=NULL;
long uBound1=0;
BSTR *pvarPt=NULL;
CPoint pt;
//CArray<POINT,POINT>ptArray;
CString strText;
for(int i=0;i<uBound+1;i++)
{
var=pvar[i];
//pVal=var.pvarVal;
pSafevar=var.parray ;
uBound1=0;
pvarPt=NULL;
if(pSafevar==NULL) continue;
//ptArray.RemoveAll ();
SafeArrayGetUBound(pSafevar,1,&uBound1);
SafeArrayLock(pSafevar);
pvarPt=(BSTR*)pSafevar->pvData ;
CLine* pLine=NULL;
pLine=new CComObject<CLine>;
//pLine->AddRef ();
if(pvarPt==NULL || pLine==NULL) continue;
for(int j=0;j<uBound1+1;j++)
{
bstr=pvarPt[j];
strPoint=OLE2T(bstr);


}

}

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧