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

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

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

Сообщение Иван Шихалев » 06.05.2005 12:25:55

Снова (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, то все работает нормально.

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

Сообщение Иван Шихалев » 10.05.2005 21:05:44

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

Сообщение trofimich » 12.05.2005 12:58:49

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

Сообщение Иван Шихалев » 12.05.2005 12:59:32

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

Сообщение trofimich » 12.05.2005 13:28:48

Так вроде ж GUID - это фишка ком. Для хранения GUID был придуман реестр. А какой реестр под линухами?
trofimich
незнакомец
 
Сообщения: 8
Зарегистрирован: 12.05.2005 11:39:17
Откуда: Харьков

Сообщение Иван Шихалев » 12.05.2005 13:31:45

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

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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru