уважаемые господа!
задам идиотский вопрос однако немного не понимаю что происходит.
я пишу плагин к кад-системе SolidWorks, функция выглядит так.
STDMETHODIMP CGSSWLink2006Server::GetListFeatures(BSTR DocumentName,SAFEARRAY** pArray,ErrorEnum *lError)
{
if (CheckLicenseInfo() != E_NO_ERROR)
{
*lError = E_LICENSE_ERROR;
return S_OK;
}
//получили документ
IModelDoc2Ptr pDocument = CheckDocumentIsInSession(DocumentName);
if (pDocument == NULL)
{
*lError = E_STATUS_DOCUMENT_NOT_VALID;
return S_OK;
}
try
{
IFeaturePtr swFeat = NULL;
std::vector<CString> vFtNames;
HRESULT hr = pDocument->IFirstFeature(&swFeat);
while(swFeat != NULL)
{
CComBSTR sbsFtName;
HRESULT hr=swFeat->get_Name(&sbsFtName);
if(IsSolidOrSheetMetalFeature(swFeat))//если это не какая-то хрень типа плоскости а действительно фичер добавляем его в массив
vFtNames.push_back((BSTR)sbsFtName);
IFeaturePtr swNextFeature = NULL;
hr = swFeat->IGetNextFeature(&swNextFeature);
swFeat = swNextFeature;
}
if(vFtNames.empty())//если массив пустой значит нет ни одного фичера.
return E_FEATURES_NOT_FOUND;
//создаем safearray
SAFEARRAYBOUND saBound[1];
saBound[0].cElements = (ULONG)vFtNames.size();
saBound[0].lLbound = 0;
*pArray = SafeArrayCreate(VT_BSTR, 1, saBound);
VARIANT Variant;
memset(&Variant,0,sizeof(VARIANT));
Variant.vt=VT_BSTR;
for(UINT i=0;i<vFtNames.size();i++)
{
long lIndex=i;
Variant.bstrVal=vFtNames.at(i).AllocSysString();
hr = SafeArrayPutElement(*pArray, &lIndex, &Variant);
}
return E_NO_ERROR;
}
catch(_com_error&)
{
*lError = E_LIST_FEATURES_ERROR;
return S_OK;
}
}
глючный код выделен жирным шрифтом.
господа, подскажите пожалуйста может кто знает в чем тут дело.
16.06.07 18:23: Перенесено модератором из 'C/C++' — Павел Кузнецов
A>глючный код выделен жирным шрифтом.
A>господа, подскажите пожалуйста может кто знает в чем тут дело.
Дело, видимо, в том, что создаете вы массив BSTR
SafeArrayCreate(VT_BSTR, 1, saBound);
А помещаете Variant-ы.
Попробуйте:
SafeArrayCreate(VT_VARIANT, 1, saBound);