SolidWorks异步模式开发,使用COM接口获取Array数据时的注意事项

此篇文章是在实际开发过程中遇到的问题,得到过同事的帮助,在此一并感谢。

在SolidWorks二次开发过程中,使用异步模式,如下代码在使用中出现了问题(可能出问题的地方,已作了注视)

BOOL CSWFun::GetProfileLength(CComPtr<ILoop2>pLoop, double &dLength)
 {
 	long edgeCount = 0;
 	pLoop->GetEdgeCount(&edgeCount);
 	if (edgeCount > 0)
 	{
 		double dLenthTemp = 0.0;
 		VARIANT_BOOL isClosed = VARIANT_FALSE;
 		VARIANT_BOOL isPeriodic = VARIANT_FALSE;
 		VARIANT_BOOL vbRet = VARIANT_FALSE;
 
 		IEdge **pEdgeArr = NULL;
 		pEdgeArr = new IEdge* [edgeCount];
 		ZeroMemory(pEdgeArr, edgeCount*sizeof(IEdge*));
 		pLoop->IGetEdges(pEdgeArr);
 		for (int i=0; i<edgeCount; ++i)
 		{
 			CComPtr<IEdge> pEdge = pEdgeArr[i];		//可能指针为NULL
 			if (pEdge == NULL)
 			{
 				continue;
 			}
 			CComPtr<ICurve> pCurve;
 			pEdge->IGetCurve(&pCurve);
 			if (NULL == pCurve)
 			{
 				continue;
 			}
 
 			double dStart = 0.0;
 			double dEnd = 0.0;
 
 			pCurve->GetEndParams(&dStart, &dEnd, &isClosed, &isPeriodic, &vbRet); //可能返回失败
 			if (vbRet != VARIANT_FALSE)
 			{
 				double dTemp = 0.0;
 				pCurve->GetLength2(dStart, dEnd, &dTemp);
 				if (dTemp > 0)
 				{
 					dLenthTemp += dTemp;
 				}
 			}
 		}
 
 		delete []pEdgeArr;
 		pEdgeArr = NULL;
 
 		dLength = dLenthTemp;
 	}
 	return TRUE;
 }
改成如下代码后,则正常

BOOL CSWFun::GetProfileLength(CComPtr<ILoop2>pLoop, double &dLength)
{
	long edgeCount = 0;
	pLoop->GetEdgeCount(&edgeCount);
	if (edgeCount > 0)
	{
		double dLenthTemp = 0.0;
		VARIANT_BOOL isClosed = VARIANT_FALSE;
		VARIANT_BOOL isPeriodic = VARIANT_FALSE;
		VARIANT_BOOL vbRet = VARIANT_FALSE;
		CComVariant vEdgeArray;

		pLoop->GetEdges(&vEdgeArray);
		if (V_VT(&vEdgeArray) == VT_EMPTY)
		{
			return FALSE;
		}
		SAFEARRAY *pSaveEdgeArray = V_ARRAY(&vEdgeArray);
		LPDISPATCH *pEdgeDispArray = NULL;
		SafeArrayAccessData(pSaveEdgeArray, (void**)&pEdgeDispArray);
		if (pEdgeDispArray == NULL)
		{
			return FALSE;
		}
		for (int i=0; i<edgeCount; ++i)
		{
			CComQIPtr<IEdge> pEdge = pEdgeDispArray[i];
			if (pEdge == NULL)
			{
				continue;
			}
			CComPtr<ICurve> pCurve;
			pEdge->IGetCurve(&pCurve);
			if (NULL == pCurve)
			{
				continue;
			}

			double dStart = 0.0;
			double dEnd = 0.0;

			pCurve->GetEndParams(&dStart, &dEnd, &isClosed, &isPeriodic, &vbRet);
			if (vbRet != VARIANT_FALSE)
			{
				double dTemp = 0.0;
				pCurve->GetLength2(dStart, dEnd, &dTemp);
				if (dTemp > 0)
				{
					dLenthTemp += dTemp;
				}
			}
		}

		dLength = dLenthTemp;
	}
	return TRUE;
}

无效的接口函数,主要是以'I'开头的获取或设置数据的函数,文中对应的是IGetEdges,改为GetEdges则正常。

API帮助的说明如下:
The COM interface is recommended for all add-in DLL projects. For executable (.exe) implementations, you can use the COM interface unless the method or property passes an  array. In this case, use the equivalent Dispatch method that uses a  VARIANT to encapsulate the array.

所以,开发过程中,如果是异步模式,需要获取array类型的数据,避免使用“I”开头的函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值