Тесселяция граней в API7

Автор Solaris, 27.08.19, 09:11:57

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

Solaris

При получении объекта тесселяции грани в API7 выбивает COM-исключение "Интерфейс не поддерживается". Что я делаю нет так? Компас V18, запуск из внешнего приложения.

OleInitialize(NULL);
IApplicationPtr KompasApp7;
KompasApp7.CreateInstance("KOMPAS.Application.7");

char cModelPath[] = "d:\\3456.m3d";
IKompasDocument3DPtr kdoc3d = KompasApp7->Documents->OpenEx(cModelPath, TRUE, FALSE, ksLCompletely);
if (kdoc3d)
{
     IPart7Ptr topPart = kdoc3d->GetTopPart();

     if (topPart)
     {
          long lBound, uBound, lCount;

          IFeature7Ptr feat(topPart);
          if (feat)
          {
               _variant_t vFaceArray = feat->GetModelObjects(o3d_face);

               if (vFaceArray.vt == (VT_ARRAY | VT_DISPATCH))
               {
                   LPDISPATCH* pFaces;

                   HRESULT hr = SafeArrayAccessData(vFaceArray.parray, (void**)&pFaces);
                   hr = SafeArrayUnaccessData(vFaceArray.parray);

                   hr = SafeArrayGetLBound(vFaceArray.parray, 1, &lBound);
                   hr = SafeArrayGetUBound(vFaceArray.parray, 1, &uBound);

                   lCount = uBound - lBound + 1;
                   for (long j = 0; j < lCount; j++)
                   {
                        IFacePtr curFace(pFaces[j]);
                        if (curFace)
                        {
                             ITessellation7Ptr tes = NULL;
                             try
                             {
                                  tes = curFace->Tessellation;
                             }
                             catch (_com_error& e)
                             {
                                  MessageBox(NULL, e.ErrorMessage(), "", MB_ICONERROR);
                                  break;
                             }
                        }
                   }
              }
          }
     }
     kdoc3d->Close(kdDoNotSaveChanges);
}
KompasApp7->Quit();
KompasApp7.Release();

Vi2

Цитата: Solaris от 27.08.19, 09:11:57

                   LPDISPATCH* pFaces;

                   HRESULT hr = SafeArrayAccessData(vFaceArray.parray, (void**)&pFaces);
                   hr = SafeArrayUnaccessData(vFaceArray.parray);


Не уверен за всё остальное, но так не делается, т.к. указатель pFaces валидный только в промежутке между SafeArrayAccessData и SafeArrayUnaccessData и вне этого промежутка не должен использоваться.

Т.е.

                   HRESULT hr = SafeArrayAccessData(vFaceArray.parray, (void**)&pFaces);

а вот здесь работа с этим указателем pFaces

                   hr = SafeArrayUnaccessData(vFaceArray.parray);