com c++ c#

来源:互联网 发布:影视app全套源码 编辑:程序博客网 时间:2024/04/29 19:57
 

由于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();

 

 

原创粉丝点击