Как реализовать IOTAProjectCompileNotifier Delphi's ToolsAPI? - PullRequest
2 голосов
/ 26 марта 2011

Я использую Delphi XE IDE.Я создаю уведомитель для реализации IOTACompileNotifier.После установки эксперта в IDE.Код работает нормально, когда я компилирую свой проект.Уведомитель работает для ProjectCompileStarted.

Во второй раз, когда я компилирую свой проект, приглашение Delphi IDE:

[Fatal Error] Access violation at address 21B7FBED in module 'delphicoreide150.bpl'. Read of address 00000000

Хотя мне кажется странным, что я выполняю:

var i: integer;
begin
  i := Project.ProjectBuilder.AddCompileNotifier(TProjectCompileNotifier.Create);
  Project.ProjectBuilder.RemoveCompileNotifier(i);
end;

в уведомлении.Я просто хочу показать, что Add and Remove компилятор уведомлений для ProjectBuilder, кажется, не работает должным образом, независимо от того, как я использую.

Посоветуйте, пожалуйста, как мне реализовать IOTAProjectCompileNotifier.

Спасибо.

Вот полный исходный код:

type
  TProjectCompileNotifier = class(TInterfacedObject, IOTAProjectCompileNotifier)
  protected
    procedure AfterCompile(var CompileInfo: TOTAProjectCompileInfo);
    procedure BeforeCompile(var CompileInfo: TOTAProjectCompileInfo);
    procedure Destroyed;
  end;

  TCompileNotifier = class(TInterfacedObject, IOTACompileNotifier)
  protected
    procedure ProjectCompileStarted(const Project: IOTAProject; Mode: TOTACompileMode);
    procedure ProjectCompileFinished(const Project: IOTAProject; Result: TOTACompileResult);
    procedure ProjectGroupCompileStarted(Mode: TOTACompileMode);
    procedure ProjectGroupCompileFinished(Result: TOTACompileResult);
  end;

procedure TCompileNotifier.ProjectCompileStarted(const Project: IOTAProject;
  Mode: TOTACompileMode);
var i: integer;
begin
  i := Project.ProjectBuilder.AddCompileNotifier(TProjectCompileNotifier.Create);
  Project.ProjectBuilder.RemoveCompileNotifier(i);
end;

var i: integer;

initialization
  i := (BorlandIDEServices as IOTACompileServices).AddNotifier(TCompileNotifier.Create);
finalization
  (BorlandIDEServices as IOTACompileServices).RemoveNotifier(i);
end.

Ответы [ 3 ]

4 голосов
/ 26 марта 2011

Я думаю, что смогу ответить на это. У меня нет XE, и поэтому у меня, похоже, нет IOTAProjectCompileNotifier. Однако другие AddNotifier методы в моем модуле ToolsAPI предполагают, что он будет объявлен как:

function AddNotifier(const ANotifier: IOTAProjectCompileNotifier): Integer;

Вы называете эту процедуру следующим образом:

i := Project.ProjectBuilder.AddCompileNotifier(TProjectCompileNotifier.Create);

Проблема в том, что ничто не берет ссылку на интерфейс, возвращаемый TProjectCompileNotifier.Create. Вам нужно сделать это, вот так:

procedure TCompileNotifier.ProjectCompileStarted(const Project: IOTAProject; Mode: TOTACompileMode);
var
  i: integer;
  Intf: IOTAProjectCompileNotifier;
begin
  Intf := TProjectCompileNotifier.Create;
  i := Project.ProjectBuilder.AddCompileNotifier(Intf);
  Project.ProjectBuilder.RemoveCompileNotifier(i);
end;

Вы должны сделать то же самое в коде инициализации / финализации.

Я считаю, что это действительно следует считать ошибкой в ​​реализации подсчета ссылок интерфейса. Это обсуждалось здесь о переполнении стека много раз.

3 голосов
/ 26 марта 2011

Интересно, почему вы удаляете свое уведомление из обратного вызова?Я мог предположить, что OTA плохо справляется со сценарием.Попробуйте сделать следующее: сначала (когда пакет загружен и инициализирован) установите IOTAIDENotifier, чтобы получать уведомления об открытии проекта (удалите его при завершении).Реализуйте его FileNotification, чтобы добавить свой IOTAProjectCompileNotifier, когда проект открыт, удалить его, когда он закрыт.

0 голосов
/ 26 марта 2011

код ошибки «Чтение адреса 00000000» может указывать на то, что вы пытаетесь получить доступ к ресурсу, который не существует.Я видел, что вы задали тот же вопрос на форуме Embarcadero.Из того, что я видел здесь на SO, есть только несколько разработчиков, которые заинтересованы в OTA, документация от CG или Embarcadero практически отсутствует, поэтому я предлагаю вам настаивать на форуме Embarcadero.

С наилучшими пожеланиями,
Раду

...