最近在做WEBGIS项目,要调用以前一些VC的DLL,所以使用COM进行封装,在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();

 

 

在COM中使用SafeArrayAccessData与SafeArrayGetElement函数,VC++调用没问题,C#调用出现问题比较让人费解,如果是WINAPP,使用前者正常,后者出现异常,而在ASP.NET中后者正常,前者出现异常。。。。。

posted on 2010-03-28 10:34  zfgis  阅读(3721)  评论(0编辑  收藏  举报