(Delphi XE2 обновление 4)Как отследить _AddRef/_Release требует объекты OLE Automation
Я пытаюсь получить большой блок автоматизации Microsoft Word OLE Я унаследованного (на основе раннего связывания TWordApplication и интерфейсов от WordXP
/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;
Свойства, необходимые для получения сообщений EAccessViolation чем ошибки $ C0000005, которые вы получаете в отладчике.
Мне интересно узнать об общем (так как мне, вероятно, понадобится это и для других проектов автоматизации), способы отслеживания вызовов _AddRef и _Release.
я взглянуть на эти ссылки:
- Understanding and correcting interface reference leaks in Delphi's Vcl.OleCtrls.pas (это не относится, как я не использую интерфейс TOleControl на основе)
- How to Find a Missing _Release (это то, что я использую до сих пор)
- Should the compiler hint/warn when passing object instances directly as const interface parameters? (не не применяется: нет константные параметры, которые принимают эти интерфейсы)
- Unused interface reference is not destroyed (исправленные в Delphi XE обновления 1 и выше)
- WinWord.exe won't quit after calling Word.Documents.Add - Word .NET Interop
- Is COM broken in XE2, and how might I work around it? (исправлено в обновлении Delphi XE2 2)
будет немного сложнее. COM-сервер не работает, поэтому код, который вы хотите использовать, находится в другом процессе. –
Я надеялся, что есть яркий способ сломать локальный прокси. –
Вы можете это сделать, но это только часть истории. Ссылки будут рассмотрены в другом процессе. –