Предполагая, что у вас есть законная причина для этого (и, используя TComponent, вполне возможно, что вы это сделаете - см. Конец ответа, почему), тогда проблема возникает в результате изменения ссылки на переменную интерфейса после того, как выуничтожил объект, на который он ссылается в настоящее время.
Любое изменение ссылки на интерфейс создает код, подобный следующему:
intfA := intfB;
становится (простыми словами):
if Assigned(intfA) then
intfA.Release;
intfA := intfB;
if Assigned(intfA) then
intfA.AddRef;
Если вы связываете это с вашим кодом, вы должны увидеть проблему:
SomeInterface.AsObject.Free;
SomeInterface := nil;
становится:
SomeInterface.AsObject.Free;
if Assigned(SomeInterface) then
SomeInterface.Release;
SomeInterface := nil;
if Assigned(SomeInterface) then
SomeInterface.AddRef;
Таким образом, вы можете видеть, что это сгенерированный вызов Release (), который приводит кот присвоения NIL интерфейсу, который вызывает нарушение прав доступа.
Вы также должны быстро увидеть, что существует простой способ избежать этого, просто отложить освобождение объекта до тех пор, пока вы не получите NIL-ссылку на интерфейс.:
obj := SomeInterface.AsObject;
SomeInterface := NIL;
obj.Free;
НО
Ключевой вопрос здесь заключается в том, почему вы явно освобождаете объект, который связан (и, вероятно,erence count).
Когда вы изменяете код для кэширования ссылки на объект и NIL интерфейса до явного освобождения объекта, вы можете обнаружить, что obj.Free будет вызывать нарушение доступа как NIL'ingссылка на интерфейс сама может привести к свободному объекту.
ЕДИНСТВЕННЫЙ способ убедиться, что явное освобождение интерфейсного объекта безопасно, это:
1) Что интерфейсобъект переопределил / переопределил IUnknown и устранил подсчет ссылок на управление временем жизни
И
2) что у вас нет других сопряженных ссылок на этот объект в другом месте вашего кода.
Еслипервое из этих условий не имеет для вас особого смысла, поэтому, не желая покровительствовать, это, вероятно, хороший признак того, что вам не следует явно освобождать объект, поскольку он почти наверняка управляется подсчетом ссылок.
Сказав это, поскольку вы используете интерфейсный класс TComponent, то доваш класс TComponent не инкапсулирует COM-объект, тогда TComponent удовлетворяет условию № 1, поэтому остается только убедиться, что остальная часть кода соответствует условию № 2.