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