|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||||||||||||||||||||||||||||||||||||||||||||||||
При перекомпиляции сервера перекомпилируется клиент, а что, собственно в этом плохого?04.03.2013, 12:54. Показов 5326. Ответов 38
Метки нет (Все метки)
Друзья!
Начинаем цикл вопросов про COM- Объекты. Первый вопрос возник по статье Безверхова, вот здесь статья. Вот там такой пример:
...Итак, компилим сервер:
Я ничё не понимаю. Может кто-то разъяснит мне, что имел ввиду Безверхов, говоря:
0
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 04.03.2013, 12:54 | |
|
Ответы с готовыми решениями:
38
Как отключить клиент от сервера, не закрывая при этом приложения
|
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
||
| 05.03.2013, 14:30 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||
| 05.03.2013, 16:28 [ТС] | ||
|
0
|
||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
||
| 06.03.2013, 10:04 | ||
|
2 если у нас "обычный" объект который не содержит полей, а состоит из одних чистых виртуальных функций причем их набор и сигнатуры фиксированы, то как бы мы не издевались над его реализацией (над объектом наследником) компиляция клиента нам не нужна - мы всегда работаем с известным интерфейсом. это и есть COM.
1
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||
| 06.03.2013, 11:34 [ТС] | ||
|
Ну, положим, первой части вполне хватило бы для ответа на вопрос, а вторая часть это то, чего не может быть
Не бывает хидера с таким описанием. (если, конечно мы ведём речь о C++ объектах. Ну то есть не выносим объект в отдельную dll). По-любому интерфейс наследника должен быть известен клиенту. Так что одним подключением абстрактного класса никак не обойтись. Ну, вы наверное имели ввиду, что если мы исхитримся сделать так, то это значит, что мы и сконструировали тот самый настоящий COM-объект, который находится в другом исполняемом модуле и никак иначе.
0
|
||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
||
| 06.03.2013, 14:33 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||
| 07.03.2013, 01:24 [ТС] | ||
|
Того не может быть, что:
0
|
||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
||
| 07.03.2013, 08:22 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 07.03.2013, 11:34 [ТС] | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||||||||||||||||||||||||||
| 10.03.2013, 03:23 [ТС] | ||||||||||||||||||||||||||
|
Внесём ясность в обсуждаемый вопрос. Мы выяснили, что при изменении хидера всегда надо пересобирать клиент.
Не по теме: Напоминаю, речь идёт исключительно о C++ коде, COM не трогаем. Я поторопился, задав вопрос в этом разделе- ну так значит не смог разобраться, пусть тему перенесут. Всегда ли? Эксперименты показали, что если клиент для доступа к данным будет пользоваться исключительно функциями-методами, тогда пересобирать его необязательно! Действительно, возьмём этот код, добавим в сервер функцию-метод (в хидер и в*.cpp)
__ZN5world8funktsiaEv из client.o ни с чем не перепутает __ZN5world8funktsiaEv из server.o Почему же линковщик может перепутать поля класса? На самом деле ответ прост, и он лежит на повержности. Все, кто отписался, его знают. А вот мне пришлось чуток подумать. В server.o генерируется код, который кладёт в первое поле world значение такое-то, а во второе такое-то. А в клиенте вынимаются значения из полей- из первого и второго. Если в хидере поменяются их имена, и клиент не узнает об этом на этапе компиляции, он не узнает этого никогда. Так и будет действовать, как запрограммирован при первой компиляции. Вернёмся с функциями, с ними всё проще. В коде они ведут себя как НЕ методы класса- то есть принадлежность к классу абсолютно никак не выявляется. (В объекте даже указателя на них нет. Был бы- не исключалась бы возможность путаницы, как с полями) Выясните размер world- он будет равен 8, по 4 байта накаждое поле string. Просто функция-метод (и конструктор) принимает указатель на объект класса и работает с ним. Все об этом знают, просто написать забыли. Ну вот и всё, собсно. То есть если пользуетесь для доступа к данным исключительно функциями, можете смело менять хидер и не трогать сырец с main. Всякое несоответствие (если таковое найдётся) между вызовами функций и тем, как они представлены в классе, выявится на этапе линковки. А не выявится, значит экзешник отработает корректно.
0
|
||||||||||||||||||||||||||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
|
| 11.03.2013, 11:25 | |
|
0
|
|
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
|
| 11.03.2013, 11:34 | |
|
итак, делаем игрушечный интерфейс и игрушечную библиотеку COM.
имеем заголовочный файл в котором есть: - определение класса my_iface с чистыми виртуальными функциями f1 и f2 - это наш игрушечный интерфейс - прототип функции create_obj возвращающей указатель на объект класса my_iface - это наша игрушечная библиотека COM (наш аналог функции CoCreateInstance). собираем DLL в которой есть класс реализующий интерфейс и есть функция возвращающая указатель на реализацию. подключаем DLL к проекту. если в заголовочном файле в определении класса поменять местами виртуальные функции f1 и f2, то при вызове obj->f1() мы ничуть не удивившись обнаружим на экране информацию говорящую о том, что реально была вызвана функция f2.
1
|
|
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
|
| 11.03.2013, 11:38 | |
|
с вызовами функций не являющимися виртуальными таких эффектов не будет, но учитывая тот факт, что в нормальных классах деструктор является виртуальным перекомпиляция нужна всегда.
0
|
|
| 11.03.2013, 11:45 | |
|
0
|
|
| 11.03.2013, 11:48 | |
|
0
|
|
| 11.03.2013, 11:54 | ||
|
Не по теме:
В шарпике есть например sealed, четко говорящий о том, что наследование запрещено. В плюсах же приходится немного углубляться в документацию.
0
|
||
| 11.03.2013, 12:07 | ||
|
Не по теме:
1
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|||
| 11.03.2013, 12:59 [ТС] | |||
|
1)использование абстрактного класса это одна история- ваш пример, 2)неиспользование абстрактного класса- другая история. Сейчас мы говорим о втором примере. Никаких абстрактных классов! Мне почему-то казалось это очевидным, раз не оговорено обратное .Что касается вашего примера, то я вчера долго думал над ним и пришёл к тому же выводу, что и вы. Создал даже тему в разделе C++ потому, что к COM это пока никаким боком. Я и эту-то поторопился в этом разделе создавать. Программа взаимодействует с классом исключительно через интерфейс. Однажды класс меняется и меняется его хидер. Надо ли перекомпилировать всю программ вот оттуда моя цитата:
0
|
|||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
|
|
| 11.03.2013, 13:13 | |
|
а с чего вообще сыр-бор кроме интереса "а что же внутри". что внутри выяснили. какой еще вопрос то?
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 11.03.2013, 13:16 [ТС] | |
|
Вопрос "что внутри" это следствие вопроса "надо ли перекомпилировать", а так всё, никакого больше.
0
|
|
| 11.03.2013, 13:16 | |
|
Проверка на стороне сервера, что клиент обработал отправленные данные Зависает клиент при приёме от сервера
Чем пользоваться при создании клиент-сервера? Тормоза При Перекомпиляции Бд Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|