COM中的安全数组SAFEARRAY、与在VC++(VARIANT) C#(object)中调用

最近在做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中后者正常,前者出现异常。。。。。

转载于:https://www.cnblogs.com/sunsky/archive/2010/03/28/1698743.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值