非常に実験的で不安定な IDE アドインを作成しましたが、これは IDE のシャットダウン時に非常に厄介な A/V を引き起こします (最近のプロジェクトの機能が壊れます、grr!)。最終的に特定のデストラクタに絞り込みました。
destructor TMyAddIn.Destroy;
begin
{$IFDEF DEBUG}
{ BUG is here, causes A/V at shutdown }
(BorlandIDEServices as IOTAMessageServices).AddTitleMessage('Goodbye');
{$ENDIF}
{ ... }
{ finalizing stuff }
{ ... }
inherited;
end;
で A/V 例外が発生しましたread of address 0x00000008
。
問題のあるステートメントにさらに防御を追加しました。
if Assigned(BorlandIDEServices) then { passes }
if Supports(BorlandIDEServices, IOTAMessageServices) then { fails }
(BorlandIDEServices as IOTAMessageServices).AddTitleMessage('Goodbye');
nil
...そして、(1)ポインターがまだ機能していない(2)QueryInterface
まだ機能している(3)目的のインターフェイスが存在しないことを理解しました。すべてが正常に見えることを考えると、フレンドリーであることを期待していますEIntfCastError
。しかし、なぜ代わりに A/V を持っているのでしょうか?