Delphi Ole - внезапная ошибка - интерфейс не поддерживается - PullRequest
0 голосов
/ 05 июня 2018

Delphi Tokyo, Office 2016. У меня уже есть приложение, которое уже давно работает.Я пошел этим утром, чтобы запустить приложение, и внезапно оно выдает ошибку.Я открываю исходный код и шаг за ним.Выдает следующую ошибку:

'Project ... raised exception class EIntfCastError with message 'Interface not supported'.

Строка кода, вызывающая проблему:

oExcel := CreateOleObject('Excel.Application') as ExcelApplication;

Исходный код не изменился.Впервые проблема была обнаружена в исполняемом файле.Excel, кажется, работает нормально.Есть еще один факт, который может иметь или не иметь значение ... Каждый раз, когда я запускаю Outlook, я получаю всплывающее сообщение об ошибке «Не удалось загрузить приложение повышения».Это началось примерно 1 месяц назад, и, насколько мне известно, я не думаю, что запустил свое приложение с тех пор, как начал получать это сообщение.Я не могу найти никакой информации об этом, но, похоже, это не влияет на Outlook.(Я выполнил как Quick Repair, так и Online Repair для MS Office 2016, но ни одно из этих действий ничего не меняет.) Когда я смотрю на плагины Outlook, у меня нет плагина под названием «Elevation».

Проблема Outlook может или не может быть связана с проблемой Excel.

Что здесь происходит?Как мне отладить это дальше?

1 Ответ

0 голосов
/ 05 июня 2018

Я бы разделил ваш код на два этапа: один для создания объекта Ole, а другой для извлечения интерфейса ExcelApplication.Таким образом, вы можете легко определить, какой из двух шагов генерирует исключение.Примерно так:

var
  oExcel : OleVariant;

...
  oExcel := CreateOleObject('Excel.Application');
  oExcel := IDispatch(oExcel) as ExcelApplication;

Если честно, когда я впервые увидел ваш код, я был удивлен, что он был скомпилирован в первую очередь, но я проверил его, и он сделал.

Однако, естьна самом деле не много смысла в назначении интерфейса ExcelApplication обратно для OleVariant.Было бы лучше назначить его интерфейсной переменной и использовать ее, чтобы использовать раннее связывание, безопасность типов и завершение кода, которые доступны в IDE.Поэтому я бы сделал что-то вроде этого:

var
  oExcel : OleVariant;
  Excel : ExcelApplication;

...
  oExcel := CreateOleObject('Excel.Application');
  Excel := IDispatch(oExcel) as ExcelApplication;
  //  then use the Excel interface instead of oExcel.

Tbh, я не достаточно опытен в COM / Ole, чтобы быть уверенным, почему разделение исходного единственного шага на два делает разницу между тем, что он не работает и не работает,Возможно, эксперт COM примет это.

...