Разобрался (спасибо CatATonik!), теперь работает как надо. В RegisterActiveObject необходимо устанавливать флаг ACTIVEOBJECT_STRONG тогда в процессе регистрации у объекта увеличивается счетчик ссылок и даже после отключения от объекта всех программ-клиентов объект из памяти не выгружается. Вот работающий код:
| Код | var FROTHandle: Integer; // ... procedure TProgControl.Initialize; begin inherited; OleCheck(RegisterActiveObject(Self as IUnknown, Class_PeViewerControl, ACTIVEOBJECT_STRONG, // вместо "ACTIVEOBJECT_WEAK" FROTHandle)); {$IFDEF COMPILER5_UP} ComServer.UIInteractive := False; {$ENDIF} end;
destructor TProgControl.Destroy; begin OleCheck(RevokeActiveObject(FROTHandle, nil)); inherited; end;
initialization TAutoObjectFactory.Create(ComServer, TProgControl, Class_ProgControl, ciMultiInstance, tmApartment);
end.
|
Нашел еще одно решение:
| Код | initialization TAutoObjectFactory.Create(ComServer, TProgControl, Class_ProgControl, ciMultiInstance, tmApartment); if Comserver.StartMode = smAutomation then ComObj.CoAddRefServerProcess; finalization if Comserver.StartMode = smAutomation then ComObj.CoReleaseServerProcess;
|
так же увеличивает счетчик ссылок на единицу, однако для второго варианта уже не будет работать схема подключения типа:
| Код | try App1 := GetActiveOleObject('...'); except try App1 := CreateOleObject('...'); except ShowMessage('Не удалось подключиться!'); end; end;
|
интересно почему? |