Получение интерфейса IApplication

Автор kornei, 03.04.13, 20:05:43

« назад - далее »

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

kornei

Добрый вечер.

В библиотеке пытаюсь получить интерфейс объекта компас

          disp := IDispatch( CreateKompasApplication );
          Kompas7 := disp As IApplication;

Вроде ничего необычного, все просто.
При попытке запуска библиотеки вылетает ошибка во вложении.

Библиотека в папке Bin есть, как положено. Что я делаю неверно?

03.04.13, 20:20:23 #1 Последнее редактирование: 03.04.13, 21:06:36 от Sabahs
Вылетает, на какой строчке кода?
У меня проблем нет, ссылка на видео работы в 64-разрядной Dll в отладчике идентичных строк кода http://forum.ascon.ru/index.php/topic,22788.msg157789.html#msg157789
Ещё вариант http://forum.ascon.ru/index.php/topic,23803.msg169287.html#msg169287

kornei

В том то и дело, что нет конкретной строчки. Т е при попытке запуска сразу выдает это сообщение и после нажатие ОК программа вылетает, не подсветив ни одну строку.
Видео ваши я смотрел еще раньше. По ним собственно и ориентировался, как этот интерфейс получать.
Возникает ощущение, что просто эта библиотека не подключена к проекту. Может на этот счет есть какие-нибудь действия?

Я так понимаю, что Step1_API7_2D тоже не запускается?
Что выдаётся после нажатия на OK?

kornei

Step1_API7_2D  не пробовал.

После нажатия ОК абсолютно ничего. Как если бы я в IDE нажал "Program Reset" во время отладки.

Я посмотрел на картинку, Вы делаете EXE файл, а там интерфейс получается не так и ссылку Вам Выше с ответом давал, для ориентира смотрите пример ksContrl.
+ Благодарностей: 1

kornei

Я так понимаю, что в этом случае мне нужно использовать

Kompas :=  KompasObject( CreateOleObject('Kompas.Application.5') );


Тогда другой вопрос. Могу ли я, работая с объектом Компас таким образом, игнорировать сообщение во вложении?

KompasObject.ksGetApplication7 - Получить указатель интерфейса приложения API версии 7, далее http://forum.ascon.ru/index.php/topic,24103.0.html

kornei

 
       Kompas :=  KompasObject( CreateOleObject('Kompas.Application.5') );
          Kompas7 := IApplication(Kompas.ksGetApplication7);
          if Kompas7 <> nil then
            begin
              Kompas.Visible := true;
              Kompas7.HideMessage := ksHideMessageNo;
end;


Но при запуске ничего не игнорируется, по прежнему приложение ждет, пока я не нажму кнопку "Игнорировать"

Попробуйте другой флаг установить ksHideMessageYes, а затем не забудьте после действий вернуть его в состояние ksShowMessage.
Установку флага нужно делать непосредственно перед действием, а сразу после завершения действия его сброс.

kornei


            try
              Kompas7.HideMessage := ksHideMessageYes;
              doc.ksOpenDocument( OpenDialog1.FileName, false );
              Kompas7.HideMessage := ksShowMessage;
            except
              Writeln(LogFile, 'Не удалось открыть файл ' + ParamStr(1));
            end;


Попадаю в исключение. Файл не открывается.
ksHideMessageNo то же самое.

А, как его открыть, если он не найден, но скорее всего нет доступа к папке или файлу.

kornei

Убираю флаг, все отлично открывается.

Можно попробовать открыть IDocuments.Open.
В отладчике на какой строке происходит исключение?

kornei

В отладчике на этой строчке
Kompas7.HideMessage := ksHideMessageYes;
вижу следующее

Вы используете OLE объект API5, получив IApplication не факт, что он будет работать корректно, нужно разбираться непосредственно в среде, на что времени нет, как обходной вариант найти окно и нажать на кнопку и нажать программно.

kornei

А примеры подобные есть?
А можно написать отдельную библиотеку rtw, подключить ее к компасу, и чтобы она при запуске скрывала все окна?

Можно, что не понятно почему Вы создаёте EXE файл, а не DLL(RTW)?

kornei

Потому что я запускаю все это из другого внешнего приложения, с различными параметрами.

Можно диалог открытия файла и получения интерфейса API7 перенести в библиотеку, в примере ksContrl есть код, как подключить библиотеку к Компасу и выполнить команду этой библиотеки.