Здравствуйте!
Каждый раз при вызове OleCreatePropertyFrame система автоматически создает объект TActiveXPropertyPage, соответственно у ComServ увеличивается счетчик ObjectCount. Необходимо как-то сделать, чтобы после закрытия странички свойств этот объект корректно разрушался и счетчик ObjectCount уменьшался.
Подскажите пожалуйста, как это можно сделать или как-то обойти эту проблему?
код вызова странички свойств примерно такой:
procedure TXXX.ShowPropertyPage;
procedure CoFreeMem(P: Pointer);
begin
if P <> nil then CoTaskMemFree(P);
end;
var
Unknown: IUnknown;
Pages: TCAGUID;
begin
OleCheck(GetPages(Pages));
try
if Pages.cElems > 0 then
begin
Unknown := Self;
OleCheck(OleCreatePropertyFrame(GetActiveWindow, 16, 16,
nil,
1, @Unknown, Pages.cElems, Pages.pElems,
GetSystemDefaultLCID, 0, nil));
end;
finally
CoFreeMem(pages.pElems);
end;
end;
Здравствуйте, mirdex, Вы писали:
...
Посмотрите
тут. Метод Release.
Здравствуйте, -prus-, Вы писали:
P>Здравствуйте, mirdex, Вы писали:
P>...
P>Посмотрите тут. Метод Release.
Да, только где взять ссылку на этот объект?
Здравствуйте, Аноним, Вы писали:
А>Да, только где взять ссылку на этот объект?
Вы указатель на этот объект передаете в функцию.
...
var
Unknown: IUnknown;
...
Unknown := Self;
OleCheck(OleCreatePropertyFrame(GetActiveWindow, 16, 16,
nil,
1, @Unknown, Pages.cElems, Pages.pElems,
GetSystemDefaultLCID, 0, nil));
...
Потом, как ненужен станет, сделайте Unknown.Release.
Здравствуйте, -prus-, Вы писали:
P>Здравствуйте, Аноним, Вы писали:
А>>Да, только где взять ссылку на этот объект?
P>Вы указатель на этот объект передаете в функцию.
P>P>...
P>var
P>Unknown: IUnknown;
P>...
P> Unknown := Self;
P> OleCheck(OleCreatePropertyFrame(GetActiveWindow, 16, 16,
P> nil,
P> 1, @Unknown, Pages.cElems, Pages.pElems,
P> GetSystemDefaultLCID, 0, nil));
P>...
P>
P>Потом, как ненужен станет, сделайте Unknown.Release.
Это не тот объект. С проблемой удалось разобраться. Как выяснилось, проблема в VCL
destructor TActiveXPropertyPage.Destroy;
begin
FPropertyPageImpl.FPropertyPage.Free;
FPropertyPageImpl.Free;
end;
Не вызывается inherited destroy