Исключение нарушения прав доступа из Поддержки Delphi -> QueryInterface - PullRequest
1 голос
/ 21 марта 2010

У меня есть следующий фрагмент кода:

  for i := 0 to FControlList.Count - 1 do
      if Supports(IMyControl(FControlList[i]), IMyControlEx) then
      begin
        MyControlEx := IMyControl(FControlList[i]) as IMyControlEx;
        MyControlEx.DoYourMagic(Self, SomeData);
      end;

Этот код вызывается много раз во время выполнения моего приложения, но в некоторых конкретных случаях он завершается с ошибкой внутри метода Supports (). А точнее - кажется, что он попадает в вызов QueryInterface () внутри метода Supports ().

Я проверил, что FControlList не ноль и FControlList [i] не ноль, и это все еще происходит.

Любая идея будет оценена !!!

1 Ответ

5 голосов
/ 21 марта 2010

Даже если FControlList[I] не nil, это не значит, что оно указывает на действительные данные. Возможно, базовый экземпляр объекта уже освобожден.

Я также предлагаю убрать приведение типа к IMyControl. Supports может принимать объекты и интерфейсы в качестве параметра, даже если они равны nil, и выдавать желаемый результат.

Кроме того, вы можете использовать этот способ вызова supports для удобства и читабельности кода:

if Supports(FControlList[i], IMyControlEx, MyControlEx) then
begin
  MyControlEx.DoYourMagic(Self, SomeData);
end;
...