Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2014, 17:18   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
Вопрос Вынести guid интерфейса в константу?

С наступающим.

У меня фейсы в одной куче и повсюду эти синие строки, глаза просто режет. Перевел их на константы. Ну и не работает, после QueryInterface в out лежит nil. Заставить работать можно? Сам гуйд нужен, значение.

Там ещё предупреждение есть: W1025 Unsupported language feature: 'custom attribute'. И что такое 'custom attribute'?
Код:
const
  CLSID_DirectResources   : TGUID = '{463F1CE9-452C-4437-BD5D-075608A672ED}';
  CLSID_DirectResourcesEx : TGUID = '{C3E10FC8-078A-4730-97DF-E08A5733ECD4}';

type
  IDirectResources = interface(IAVX)
  [CLSID_DirectResources]
    procedure Test;
  end;

  IDirectResourcesEx = interface(IDirectResources)
  [CLSID_DirectResourcesEx]
    procedure Test;
  end;

type
  TDirectResources = class(TNonReferenceCountedInterfacedObject, IDirectResources)
    procedure Test;
  end;

  TDirectResourcesEx = class(TDirectResources, IDirectResourcesEx)
    procedure Test;
  end;

implementation

procedure TDirectResources.Test;
begin
ShowMessage('Worked');
end;

procedure TDirectResourcesEx.Test;
begin
ShowMessage('Extended Worked!');
end;


procedure Execute;
var
normal : IDirectResources;
dataex : IDirectResourcesEx;
begin
dataex := TDirectResourcesEx.Create;
dataex.QueryInterface(CLSID_DirectResources,normal);
dataex.Test;
normal.Test; //<- normal = nil 
end;
WhiskasTM вне форума Ответить с цитированием
Старый 14.12.2014, 17:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Перевел их на константы.
А когда в коде были, работало?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2014, 17:55   #3
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А когда в коде были, работало?
Да, вот так работает:
Код:
const
  CLSID_DirectResources   : TGUID = '{463F1CE9-452C-4437-BD5D-075608A672ED}';
  CLSID_DirectResourcesEx : TGUID = '{C3E10FC8-078A-4730-97DF-E08A5733ECD4}';

type
  IDirectResources = interface(IAVX)
  ['{463F1CE9-452C-4437-BD5D-075608A672ED}']
    procedure Test;
  end;

  IDirectResourcesEx = interface(IDirectResources)
  ['{C3E10FC8-078A-4730-97DF-E08A5733ECD4}']
    procedure Test;
  end;

var
normal : IDirectResources;
dataex : IDirectResourcesEx;
begin
dataex := TDirectResourcesEx.Create;
dataex.QueryInterface(CLSID_DirectResources,normal);
dataex.Test;
normal.Test;//<- 'Worked!'
end;

Последний раз редактировалось WhiskasTM; 14.12.2014 в 17:58.
WhiskasTM вне форума Ответить с цитированием
Старый 15.12.2014, 09:24   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Код:
type
  IDirectResourcesEx = interface(IDirectResources)
  ['{C3E10FC8-078A-4730-97DF-E08A5733ECD4}'] ///Эта строка ТОЖЕ ЕСТЬ объявление константы (точнее задание значения константы IDirectResourceEx)
Для использования именованного доступа (по IDirectResourceEx) в операциях приведения (получения) интерфейсов. GetInterface\QueryInterface\Supports\.... 
    procedure Test;
  end;

var
normal : IDirectResources;
dataex : IDirectResourcesEx;
begin
dataex := TDirectResourcesEx.Create;
dataex.QueryInterface(IDirectResourcesEx,normal); //
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.12.2014 в 09:28.
evg_m вне форума Ответить с цитированием
Старый 15.12.2014, 10:01   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Пе-е-еристый карась...
А я то думал что ты в QueryInterface подставлял константу...
Вот кстаи как раз ['{463F1CE9-452C-4437-BD5D-075608A672ED}'] и есть Custom Attribute, и скорее всего так как ты хочешь писать низзя.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2014, 14:35   #6
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Нужно константу без TGUID описать, просто через "равно".
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 16.12.2014, 11:29   #7
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Stilet, в QueryInterface я константу посылал, CLSID_ которая, её и в фейсе пытался выставить. Двух зайцев сразу хотел, как evg_m определил: именнованный и неименнованный доступы, но с единственным const гуйдом.

Vapaamies, сработало! StringtoGUID правда придется делать. Иль два параллельных списка гуйдов. Всё, всё прощайте синие надписи...
WhiskasTM вне форума Ответить с цитированием
Старый 16.12.2014, 11:50   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Всё, всё прощайте синие надписи...
Не оч. понимаю чем тебе не понравились "синие"... Меня как-то не парят такие... "фички".
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.12.2014, 13:28   #9
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от WhiskasTM Посмотреть сообщение
Vapaamies, сработало! StringtoGUID правда придется делать. Иль два параллельных списка гуйдов.
StringToGUID в SysUtils описана.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 16.12.2014, 14:46   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
Vapaamies, сработало! StringtoGUID правда придется делать.
В моем примере НЕТ никаких StringtoGUID и используется именованный доступ.
В качестве имени выступает имя самого интерфейса.
Еще раз повторю именно для этого и была придумана GUID строка в описании интерфейса.
чтобы было можно там где требуется GUID использовать соответствующее имя (имя интерфейса!!)

Кроме того CLSID_... не используется и его (все ваши константы) можно и нужно выкинуть.
Оставить только описания интерфейсов с указанием его GUID.
И далее для запросов интерфейсов использовать их имена (а GUID транслятор подставит сам! )
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.12.2014 в 14:56.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
COM и GUID kineziz Общие вопросы C/C++ 4 21.07.2012 20:02
Guid - это, что wanes101 Win Api 4 07.10.2011 08:22
Структура System.Guid Saori C# (си шарп) 11 05.07.2011 17:17
Вопрос по GUID mike_tihomirov Общие вопросы C/C++ 1 12.03.2010 18:03
GUID Excel'Я пасечник Microsoft Office Excel 4 21.12.2009 20:28