Старый глюк в новом виде

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Снова (1.9.8, 1.9.9) глючит при работе с несколькими интерфейсами в одном классе. Как и раньше следующий код вызывает AV:

Код: Выделить всё

type
  I1 = interface(IUnknown)
  ['29f1f9cd-9def-48e9-b60b-f9e6adf50383']
    procedure Do1;
  end;

  I2 = interface(IUnknown)
  ['b1096430-801e-4508-b5a0-0b4a21063bb4']
    procedure Do2;
  end;

type
  TXXX = class(TInterfacedObject, I1, I2)
    procedure Do2;
  end;

procedure TXXX.Do1;
 begin
 WriteLn ('Do 1')
 end;

procedure TXXX.Do2;
 begin
 WriteLn ('Do 2')
 end;

var
  X1 : I1;
  X2 : I2;

begin
 X1 := TXXX.Create;
 X1.Do1;
 if not (X1.QueryInterface (I2, X2) = 0)
    then WriteLn ('Not found I2')
    else X2.Do2;
end.

Но если раньше проблема была в неправильно инициализируемом регистре, отвечающем за <span style='font-family:COURIER'>Self</span>, то сейчас неверно отрабатывает <span style='font-family:COURIER'>QueryInterface</span> — в X2 попадает тот же адрес, что и в X1.
Что характерно, если ввести промежуточный класс, реализующий I1, а от него уже унаследовать TXXX, то все работает нормально.

Сейчас качаю последние исходники, в праздники попытаюсь разобраться, что к чему...
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Мдя, здорово я облажался... А компилятор ошибки не выдал. GUID должен заключаться в фигурные скобки, иначе FPC его как нулевой прописывает.
trofimich
незнакомец
Сообщения: 8
Зарегистрирован: 12.05.2005 11:39:17
Откуда: Харьков

Сообщение trofimich »

А какой смысл в QueryInterface под Linux ?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

А какая разница под чем?
trofimich
незнакомец
Сообщения: 8
Зарегистрирован: 12.05.2005 11:39:17
Откуда: Харьков

Сообщение trofimich »

Так вроде ж GUID - это фишка ком. Для хранения GUID был придуман реестр. А какой реестр под линухами?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Все равно как-то идентифицировать надо и внутри программы... И получать нужный интерфейс, если объект поддерживает несколько. Почему бы не QueryInterface и GUID?

И вообще, счетчик ссылок - тоже вещь нужная, так что я модель COM предпочитаю...
Ответить