|
|
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
При объявлении интерфейса программист может явно указать GUID тут же в исходном коде, как бы “подсказка” для компилятора, какое значение сохранить в скомпилированном коде. Это необходимо для связывания с внешними программами(COM-объекты, библиотеки), также это требование операторов(AS и “QI”). Здесь все логично. Но, мой вопрос касается ситуации, когда интерфейсы работают внутри одной .exe-программы (т.е. не контактируют с внешними программами). Вопрос: Если GUID явно НЕ указан в исходном коде, то какую “опасность” не сможет предвидеть компилятор (т.е. в скомпилированном коде появится runtime ошибка) ? Спасибо. P.S. название темы - это как пытаюсь найти ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 05:51 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, GUID сохраняется в RTTI (смотри модуль System.TypInfo и TObject.GetInterfaceEntry) Чревато тем, что когда у тебя есть переменная общего типа, например, IInterface, ты не сможешь получить его частный случай Частный случай находится как раз по GUID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 07:05 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU GUID сохраняется в RTTI Понять помог бы самый простой пример: Когда из исходника убираем GUID, а в runtime выскакивает AV. P.S. Вопрос в том, чего не хватает компилятору, чтоб самому сориентироваться(по исходному коду) и правильно сгенерить GUID(там, где их программист не указал явно). М.б. требование “однопроходности” ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 07:11 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, А откуда инфа, что такой сценарий получится? Я пока слабо его представляю Попробуй поиграться с таким сценарием Пока я вижу, что компилятор не даёт получить интерфейс без гвида Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 07:19 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU А откуда инфа, что такой сценарий получится? Нет инфы, это лишь предположение. Еще предположение: QI - как оператор (от имени компилятора требует GUID). Нужен другой пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 07:25 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, Накатал вариант QueryInterface возвращает результат, но код вызывает AV Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 07:29 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Накатал вариант QueryInterface возвращает результат, но код вызывает AV И добавление GUID заставляет этот код работать правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 07:46 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st И добавление GUID заставляет этот код работать правильно? Добавление гвида приведёт к тому, что QueryInterface ничего не найдет Если в коде есть проверка результата QueryInterface - AV не произойдёт Artem.1st P.S. Как окно консоли оставить на экране ....? сворачивается после вылета... try/except ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 07:50 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Добавление гвида приведёт к тому, что QueryInterface ничего не найдет Но, к сожалению, “Пример” логически неработающий в обоих случаях (задан ли GUID явным способом или это сделал компилятор неявно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 08:32 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, по логике Примера, в этой строке должен вернуться интерфейс: SOFT FOR YOU Код: pascal 1. ... но, он не вернется. Не спасает даже явное GUID в декларации интерфейса. "Ухищрения" лишь помогают получить '0' вместо random(AV), т.е. Пример логически не работает. В любом случае, Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 08:55 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, Да ладно ) Во-первых, не ясно, чего ты хочешь получить. С чего ты взял, что на практике будет AV не ясно. Тем более на уровне компилятора. На уровне компилятора ты не сможешь взять as для интерфейса без гвида. Даже QueryInterface не сможешь вызвать для интерфейса без гвида Насчёт как может получиться вышеуказанный пример Например, если ты разрабатываешь шаблон, где в качестве типа используется интерфейс, соответственно GetTypeKind равен tkInterface, а гвид можно получить из Rtti Как раз QueryInterface так и принято использовать Код: pascal 1. Может ты не вкурил пример. TMyObj не поддерживает IMyIntfEx, соответственно QueryInterface не должен вернуть ничего, но он возвращает другой интерфейс. Это происходит потому, что GetTypeData(TypeInfo(IMyIntfEx)).GUID для интерфейсов без гвида возвращает нули, что соответствует IInterface. Т.е. запрашиваешь какой-то интерфейс без гвида, а по факту получается IInterface ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 09:30 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Код: pascal 1. Функция QueryInterface объявлена как Код: pascal 1. Просто при вызове выше компилятор вместо IMyIntf сам подставляет его GUID. Нет GUID - нет интерфейса. AV тут вообще не при чём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 10:48 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
alekcvp, Я в курсе ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 10:49 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st SOFT FOR YOU, по логике Примера, в этой строке должен вернуться интерфейс: SOFT FOR YOU Код: pascal 1. ... но, он не вернется. Не спасает даже явное GUID в декларации интерфейса. "Ухищрения" лишь помогают получить '0' вместо random(AV), т.е. Пример логически не работает. В любом случае, Спасибо. Код: pascal 1. то увидите {00000000-0000-0000-0000-000000000000} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 11:27 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Пост( 22212431 ) получился непонятым. Уже 3 уважаемых собеседника его неверно поняли. Приношу извинения. А такой вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 11:58 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Похоже, монгольский мальчик вернулся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 11:59 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, SOFT FOR YOU Может ты не вкурил пример. TMyObj не поддерживает IMyIntfEx, соответственно QueryInterface не должен вернуть ничего, но он возвращает другой интерфейс. Это происходит потому, что GetTypeData(TypeInfo(IMyIntfEx)).GUID для интерфейсов без гвида возвращает нули, что соответствует IInterface. Т.е. запрашиваешь какой-то интерфейс без гвида, а по факту получается IInterface ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 12:09 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 12:12 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Тут хранится: Код: pascal 1. 2. 3. 4. 5. Рекомендуется ограничить дженерик как-то так <T: IInterface> в объявлении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 12:39 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, Интерфейс - это указатель массив методов. У него может быть GUID, а может и не быть. И тот и другой вариант будет работать. GUID нужен для COM, т. к. по GUID происходит поиск нужного интерфейса. В делфи мы создаем указатель на интерфейс при помощи класса, поэтому GUID не нужен. В некоторых исключениях GUID все же нужен для работы с интерфейсами в Delphi. Поэтому общим правилом будет GUID добавлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 12:41 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
ziv-2014 Artem.1st, Интерфейс - это указатель массив методов. У него может быть GUID, а может и не быть. И тот и другой вариант будет работать. GUID нужен для COM, т. к. по GUID происходит поиск нужного интерфейса. В делфи мы создаем указатель на интерфейс при помощи класса, поэтому GUID не нужен. В некоторых исключениях GUID все же нужен для работы с интерфейсами в Delphi. Поэтому общим правилом будет GUID добавлять. Есть в Rtti TVirtualInterface, TRawVirtualClass которые позволяют создать interface при этом не создавать класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 12:53 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Если вы не задаете GUID, то вы не сможете получить корректный интерфейс через QueryInterface. Цель GUID найти нужный интерфейс через QueryInterface. Если вы не собираетесь этого делать, то можете не задавать GUID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 13:25 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
ziv-2014, Была такая библиотека TForge, так там автор интерфейсы к recrod'ам прикручивал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 13:30 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
12.10.2020 13:30, alekcvp пишет: > Была такая библиотека TForge, так там автор интерфейсы к recrod'ам прикручивал :) эммм... зачем?! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 13:31 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
ziv-2014 Если вы не задаете GUID, то вы не сможете получить корректный интерфейс через QueryInterface. Цель GUID найти нужный интерфейс через QueryInterface. Если вы не собираетесь этого делать, то можете не задавать GUID. Я написал обертку к QueryInterface и получаю интерфейсы без GUID через TypeInfo Все интерфейсы можно получать через TypeInfo... Даже задачу сделал в QC, чтобы они изменил RTL, чтобы из коробки это работало для is/as ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 13:32 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Может ты не вкурил пример. TMyObj не поддерживает IMyIntfEx, соответственно QueryInterface не должен вернуть ничего, но он возвращает другой интерфейс. Это происходит потому, что GetTypeData(TypeInfo(IMyIntfEx)).GUID для интерфейсов без гвида возвращает нули, что соответствует IInterface. Т.е. запрашиваешь какой-то интерфейс без гвида, а по факту получается IInterface:-( Я искренне верил, что собеседник пытается помочь, он написал "Пример”, который к текущей теме(про GUID) никак НЕ относится. На мой вежливый комментарий, что "Пример” не подходит(к этой теме), быстро появляется "ъъъъъ" и пишет оскорбления. Ну, детский сад на форуме... Ниже см. “Пример”, к нему претензий НЕТ, ну, обычная логическая ошибка(AV в обоих случаях) procedure DoSome; не вызовется никогда! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 13:45 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, Ну ты даёшь Вроде несколько раз сказали одно и то же Ты так до сих пор и не понял, о чём тут речь Ну может это тебе поможет. Я не знаю уже как и что тебе объяснять Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 13:55 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий эммм... зачем?! Но это не точно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 15:11 |
|
||
|
Где в скомпилированном коде хранится GUID интерфейса?
|
|||
|---|---|---|---|
|
#18+
alekcvp ziv-2014, Была такая библиотека TForge, так там автор интерфейсы к recrod'ам прикручивал :) TChromium https://github.com/salvadordf/CEF4Delphi примерно тем же занимается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2020, 16:30 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037938]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 354ms |

| 0 / 0 |
