(Delphi XE2 アップデート 4)
すべての参照が解放されたときに、継承した大きな Microsoft Word OLE オートメーション ユニット (早期バインディング TWordApplicationWordXP
と/Word2010
ユニットからのインターフェイスに基づく) を閉じようとしています。WINWORD.EXE
これまでのところ、いくつかの参照リークを見つけたようです。ほとんどの参照はプロパティまたはローカル変数です。
ただし、一部の使用シナリオはまだWINWORD.EXE
開いたままです。
修正のいくつかは、チェーンの代わりにローカル変数を優先する必要があることを示しています
procedure TOffice_10_XP_WordInterface.AddDocument;
var
WordApplicationDocuments: Documents;
begin
WordApplication_Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;
に
procedure TOffice_10_XP_WordInterface.AddDocument;
var
WordApplicationDocuments: Documents;
begin
WordApplicationDocuments := WordApplication_Documents;
WordApplicationDocuments.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;
この関数を呼び出す WordApplication_Documents プロパティに基づいています。
function TOffice_10_XP_WordInterface.GetWordApplication_Documents: Documents;
begin
Result := WordApplicationReference.Documents;
if not Assigned(Result) then
raise EAccessViolation.Create('Documents');
end;
プロパティは、デバッガーで発生する $C0000005 エラーよりもEAccessViolationメッセージを読みやすくするためにあります。
_AddRefおよび_Release呼び出しを監視する一般的な方法について疑問に思っています (おそらく他の自動化プロジェクトでもこれが必要になるため) 。
私はこれらのリンクを見ました:
- Delphi の Vcl.OleCtrls.pas でのインターフェイス参照リークの理解と修正( TOleControlベースのインターフェイスを使用していないため、適用されません)
- 欠落している _Release を見つける方法(これは私が今まで使用しているものです)
- オブジェクト インスタンスを const インターフェイス パラメーターとして直接渡すときに、コンパイラはヒント/警告を表示する必要がありますか? (適用されません: これらのインターフェースを取る const パラメーターはありません)
- 未使用のインターフェイス参照は破棄されません(Delphi XE アップデート 1 以降で修正)
- Word.Documents.Add を呼び出した後、WinWord.exe が終了しない - Word .NET Interop
- COM は XE2 で壊れていますか?どうすれば回避できますか? (Delphi XE2 update 2 で修正)