关闭

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

标签: c#objectvc++asp.netdllnull
2268人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:295299次
    • 积分:3873
    • 等级:
    • 排名:第8544名
    • 原创:6篇
    • 转载:475篇
    • 译文:0篇
    • 评论:14条
    最新评论