Здравствуйте, Аноним, Вы писали:
А>Может быть, не сразу смогу внятно объяснить т.к. тема для меня новая и я в боевом режиме изучаю использование интерфейсов. Проблема в следующем: накатал dll, которая поставляет нужный мне интерфейс. В нем осуществляется вызов обычной VCL-формы. В стороннем приложении вызов моего интерфейса производится по CreateObject("bla-bla"). Затем вызов метода интерфейса приводит к созданию формы (немодальной), осуществляющей некоторые действия, и которая может некоторое время висеть сама по себе. Но проблема в том, что вызывающее приложение может завершиться, пока моя форма присутствует. В этом случае вываливается AV, впрочем, понятно почему. Непонятно, как с этим бороться? т.к. я еще не слишком глубоко постиг механизм всей этой кухни...
А>P.S. Мой интерфейс — наследник от IDispatch, инкапсулируется классом так: IControlWindow = interface(IDispatch)
А> ['{67642A6A-7E5E-41E2-A2E3-ECF9D03503C0}']
А> procedure ShowControlWindow(iType: Integer; iIndex: Integer); safecall;
А> end;
А> IControlWindowDisp = dispinterface
А> ['{67642A6A-7E5E-41E2-A2E3-ECF9D03503C0}']
А> procedure ShowControlWindow(iType: Integer; iIndex: Integer); dispid 201;
А> end;
А> TControlWindow = class(TAutoObject, IControlWindow)
А> procedure ShowControlWindow(iType: Integer; iIndex: Integer); safecall;
А> end;
А>Что, где проверить\отловить надо, чтобы успеть уничтожить форму в момент завершения вызывающего приложения?
Ответ на твой вопрос заключается в том, какой доступ к форме (немодальной) она позволяет. Если экземпляр доступен по указателю, то определи метод завершения CloseControlWindow и вызывай при закрытии клиента. В VB (судя по коду в другом посте) есть события на закрытие формы — QueryUnload и Unload, в которых можно оповестить этот экземпляр. Если экземпляр не доступен, то его как бы фактически нет, и поэтому то, что он жив, является простым недоразумением.