Получить указатель на интерфейс документа

Автор creasysee, 16.02.04, 16:56:30

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

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

creasysee

Есть следующий фрагмент кода:

   KompasObject g_kpApp(NULL);
   ksDocument3D  g_kpDoc(NULL);      
   fun1() {
      g_kpApp.CreateDispatch(_T("Kompas.Application.5"));
      if ( g_kpApp.m_lpDispatch ) {
          g_kpApp.SetVisible( TRUE );
          fun2();
      }
   }
   fun2(){
      g_kpDoc.AttachDispatch( g_kpApp.Document3D(), FALSE );
      g_kpDoc.Open(PathModels, FALSE);
   }

Почему иногда, не всегда, а именно иногда AttachDispatch вываливает ASSERT по причине (g_kpApp.Document3D() == NULL) ?
И избавиться от этого глюка не всегда помогает даже перезагрузка! Причем, при написании кода на VB сталкивался с такой же мутью:

        If Not kpApp Is Nothing Then
            Set kpDocument3D = kpApp.Document3D
            If Not kpDocument3D Is Nothing Then
                If kpDocument3D.Open(PartName, IsInvisible) Then
 
Здесь kpApp.Document3D возвращает иногда Nothing !!! - пришлось поставить If и ругаться "не могу открыть деталь"!
Помогите решить глюк!

creasysee

Через 100 лет разобрался сам. Дело в следующем: У меня возникала необходимость закрывать документ по кнопке. Если юзверь закрывал окно сам, то после нажатия на кнопку метод
   ksDocument3D::close
в исключение не падал и вроде бы выполнялся (правда с сообщением в Debug Output 'такой-то поток завершен с кодом 0'), но после этого получить аттач
   Part.AttachDispatch(kpApp.Document3D(), FALSE); не удавалось, т.к.
kpApp.Document3D() возвращался NULL.
Проверить на то, что документ закрыт юзверем, только если через эвенты - геморройно, особенно если кроме этого момента они не нужны, т.к.
Part.m_lpDispatch все равно не NULL. ActiveDocument тоже не прокатывал, т.к. активным может стать не тот документ.
Решение оказалось простым:
   kpApp.ActivateControllerAPI();
   Part.AttachDispatch(kpApp.Document3D(), FALSE);
Т.е. при закрытии документа которого нет, падает контроллер апи, который затем нужно активировать. :)
Еще не проверял, что происходит с версией 6.0 (вышесказанное было для 6.1). Там метод ActivateControllerAPI наружу не оттопырен, а глюк есть наверняка. Лекарство - апгрейд на 6.1...

Dells

Здравствуйте. Вышел Компас 7. Сразу поймал этот глюк на семерке. Хорошо что оттопырен ActivateControllerAPI. Помогает также хорошо... :))