com c++ c#

 

由于COM中不能直接使用数组,所以经常使用到SAFEARRAY与VARIANT的转换

 SAFEARRAY*   pSA; 

 SAFEARRAYBOUND   aDim[1];  //定义安全数组维数

 aDim[0].lLbound=0;  

 aDim[0].cElements=2;   //一维数组的元素数

 pSA=SafeArrayCreate(VT_R8,1,aDim);   //创建类型为DOUBLE的数组

 ASSERT(pSA);  

 long   aLong[1];  

 for(unsigned long l=aDim[0].lLbound;l<(aDim[0].lLbound+aDim[0].cElements);l++) 

 {  

  DOUBLE vTmp;  

  vTmp=0.2*l;

  aLong[0]=l;

  SafeArrayPutElement(pSA,aLong,&vTmp);  //插入元素

 }

将SafeArray转成VARIANT

VARIANT   var;  

 VARTYPE   vt;  

 VariantInit(&var);  

 SafeArrayGetVartype(pSA,&vt);  

 var.vt = VT_ARRAY|VT_VARIANT;  

 var.parray=pSA;  

 

COM中将VARIANT 转成 SafeArray

STDMETHODIMP CZStation::GetDStation(VARIANT* vStaList, DOUBLE* SUM){

 DOUBLE* pValue=NULL;

 SAFEARRAY* pArray=var.parray;

 SafeArrayAccessData(pArray,(void**)&pValue);//

 long Low(0),High(0);

获取数组的高位和低位

 SafeArrayGetLBound(pArray,1,&Low);

 SafeArrayGetUBound(pArray,1,&High);

 LONG i;

DOUBLE SUM = 0;

 for(i=Low; i<High-Low+1; i++)

 {

  *SUM += pValue[i];

 }

 return S_OK;

}

C#中调用COM

            ZStation zst = new ZStationClass();            double dSta;            double[] dlist = new double[2];            dlist[0] = 5.0;            dlist[1] = 10.0;            object vstalsit = dlist;            dSta = zst.GetDStation(ref vstalsit);

VC++中调用COM

 SAFEARRAY*   pSA;  

 SAFEARRAYBOUND   aDim[1];  

 aDim[0].lLbound=0;  

 aDim[0].cElements=2;  

 pSA=SafeArrayCreate(VT_R8,1,aDim);  

 ASSERT(pSA);  

 long   aLong[1];  

for(unsigned long l=aDim[0].lLbound;l<(aDim[0].lLbound+aDim[0].cElements);l++)   {  

  DOUBLE vTmp;  

  vTmp=0.2*l;

  aLong[0]=l;

  SafeArrayPutElement(pSA,aLong,&vTmp); 

 }

 CoInitialize(NULL);

 double dsta;

 CLSID clsid;

 CLSIDFromProgID(OLESTR("ZGISCOM.ZStation"),&clsid);

 CComPtr<IZStation> pStation;

 pStation.CoCreateInstance(clsid);

 double vv = pStation->GetDStation(&var);

 pStation.Release();

 CoUninitialize();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值