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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值