2011-07-05 3 views
0

У меня есть простой класс автоматизации, как это:TAutoObject в delphi lifecycle ..?

type 
    TTest_COM = class(TAutoObject, ITest_COM) 
    private 
    Variable: TClass; 
    protected 
    procedure Test(parameters...); safecall; 
    public 
    procedure Initialize; override; 
    destructor Destroy; override; 
    end; 

implementation 

destructor TTest_COM.Destroy; 
begin 
    Variable.Free; 
    inherited; 
end; 

procedure TTest_COM.Initialize; 
begin 
    inherited; 
    Variable := TClass.Create; 
end; 

procedure TTest_COM.Test(parameters...); safecall; 
begin 
    // this method makes use of "Variable" 
end; 

Может кто-нибудь объяснить мне жизненный цикл такого объекта ком, который действует как MSMQ приемник?

Проблема в том, что процедура: Тест иногда срабатывает при отсутствии выделенной «переменной». Когда я удаляю строку: Variable.Free; Он работает отлично, несмотря на то, что использование памяти для dllhost.exe растет.

Почему такие вещи случаются?

EDIT:

Потому что я не могу ответить на мой собственный вопрос. Я делаю это здесь.

Проблема решена.

Класс выделял глобальную переменную. Я этого не заметил.

В этом была проблема с заменой другой переменной.

Благодарим за помощь!

+0

Почему вы не создаете 'Variable' в конструкторе? Кроме того, что такое 'TClass'? –

+0

Я предполагаю, что вы используете это в COM +, чтобы вы могли подклассифицировать 'TMtsAutoObject' вместо' TAutoObject' и использовать OnActivate и OnDeactivate для создания/освобождения переменной. Это то, что я делаю для обычного COM + объекта. Я не пробовал это с слушателем MSMQ. –

+0

@ Марьян Венема, потому что, как гость (я полагаю), я получил информацию, что после 6 или более часов я могу это сделать :) Это смешно, но ничего не может с этим сделать :) – John

ответ

0

AutoObject должен быть освобожден, когда счетчик ссылок достигнет нуля.

Я подозреваю, что ошибка не в вашем коде, а в коде, который использует этот объект. В коде, который использует ваш объект, счетчик ссылок достигает нуля и уничтожается, но процедура Test по-прежнему вызывается из этого кода на освобожденном объекте. Вот почему Test иногда работает с не распределенной переменной: объект TTest_COM уже уничтожен.