此篇文章是在实际开发过程中遇到的问题,得到过同事的帮助,在此一并感谢。
在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”开头的函数。