- Код: Выделить всё
- 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, то все работает нормально.
Сейчас качаю последние исходники, в праздники попытаюсь разобраться, что к чему...



