Название: Работа с dll Отправлено: Mityai от Март 15, 2010, 16:12 Доброго всем времени суток! Хотелось бы задать несколько вопросов...
1) Правильно ли я понимаю, что если мы прописываем класс в dll, то у нас вне зависимости от количества подключенных приложений создается один общий для них всех кусок адресного пространства с одним объектом этого самого dll-класса для каждого приложения? 2) Пытался найти пример реализации класса в dll и работы с ним на форуме, но что-то так и не нашел. Смотрел топик и пример от "Eugene Efremov" из "Вики", но там вроде как этот объект класса из dll явно создается... Или иначе сделать невозможно? С dll работаю 2-ой день можно сказать, вот маленький пример моего кода. main Код: QLibrary lib("dynlib"); dynlib.cpp Код: #include "dynlib.h" dynlib.h Код: #ifndef DYNLIB_H Библиотеку создавал в конструкторе. 3) Есть несколько приложений - некоторые написаны на Qt, некоторые на MFC (MSVS 2005). Хотелось бы организовать обмен данными между ними. Насколько удобно это делать через dll, во что это может вылезти при унификации кода и есть ли какая-то альтернатива? Вся система приложений критична во времени и обмен должен происходить быстро. Прошу меня простить, если я совсем чайник, не вижу очевидных вещей и не умею копаться в форуме. Если кинете мне ссылки на материалы, в которых есть ответы на эти вопросы, буду очень благодарен! Спасибо! Название: Re: Работа с dll Отправлено: Igors от Март 15, 2010, 17:10 1) Правильно ли я понимаю, что если мы прописываем класс в dll, то у нас вне зависимости от количества подключенных приложений создается один общий для них всех кусок адресного пространства с одним объектом этого самого dll-класса для каждого приложения? Нет. Если класс описан в dll (экспортируется) то это просто значит что реализации методов класса (т.е. код) общий для всех модулей использующих этот dll. Сами же объекты (экземпляры) этого класса будут находиться в своих модулях где они были созданы. Если же Вам надо "общий объект (т.е. данные)" - то это не просто так, для Вындоуз можно читать "dll shared data" (сам не делал). 2) Необязательно загружать dll явно/руками как в Вашем примере. Так делают но относительно редко. Чаще просто подключают dll хедеры и lib файл к проекту и загрузчик все сделает, можно звать ф-ции dll (собственно Qt программы так и делают). В Вындоуз это "перевертыш" _declspec(dllimport) _declspec(dlexport) в хедерах. 3) Есть несколько приложений - некоторые написаны на Qt, некоторые на MFC (MSVS 2005). Хотелось бы организовать обмен данными между ними. Насколько удобно это делать через dll, во что это может вылезти при унификации кода и есть ли какая-то альтернатива? Вся система приложений критична во времени и обмен должен происходить быстро. dll неприменимы между 32 и 64 битными приложениями. Во всех остальных случаях (если дело происходит на 1 машине) они удобнее и быстрее чем все остальное (сокеты, сигналы, shared memory).Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 17:16 3) Есть несколько приложений - некоторые написаны на Qt, некоторые на MFC (MSVS 2005). Хотелось бы организовать обмен данными между ними. Насколько удобно это делать через dll, во что это может вылезти при унификации кода и есть ли какая-то альтернатива? Вся система приложений критична во времени и обмен должен происходить быстро. dll неприменимы между 32 и 64 битными приложениями. Во всех остальных случаях (если дело происходит на 1 машине) они удобнее и быстрее чем все остальное (сокеты, сигналы, shared memory).И как можно сравнивать dll и средства межпроцессного взаимодействия? ::) Название: Re: Работа с dll Отправлено: Igors от Март 15, 2010, 18:09 Как можно использовать dll для обмена данными между приложениями? Есть "обмен данными" и есть "синхронизация" - это разные вещиИ как можно сравнивать dll и средства межпроцессного взаимодействия? Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 18:26 Как можно использовать dll для обмена данными между приложениями? Есть "обмен данными" и есть "синхронизация" - это разные вещиИ как можно сравнивать dll и средства межпроцессного взаимодействия? Название: Re: Работа с dll Отправлено: Igors от Март 15, 2010, 18:43 А какое отношение к этому имеют dll? Прямое :)Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 18:46 Прямое :) Объясни пожалуйста, как с помощью разделяемой библиотеки можно обмениваться данными между приложениями? ;)Название: Re: Работа с dll Отправлено: Mityai от Март 15, 2010, 22:15 2 Bre & Igors
Когда создавал этот топик, блаженно веровал в относительную правильность утверждения за номером 1, из чего вполне логично вытекала возможность межпроцессной связи. Однако, теперь я сам не могу понять насколько реально это создать, поэтому Igors, не сочтите за труд нам этот вопрос разъяснить ;D Правильно ли я понимаю, что ответ на этот вопрос лежит в ответе на первый, а именно в dll shared memory? Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 22:37 2 Bre & Igors Думаю имелось ввиду следующее:Когда создавал этот топик, блаженно веровал в относительную правильность утверждения за номером 1, из чего вполне логично вытекала возможность межпроцессной связи. Однако, теперь я сам не могу понять насколько реально это создать, поэтому Igors, не сочтите за труд нам этот вопрос разъяснить ;D Правильно ли я понимаю, что ответ на этот вопрос лежит в ответе на первый, а именно в dll shared memory? Код
Но это такой же механизм, который использует QSharedMemory. Название: Re: Работа с dll Отправлено: Mityai от Март 15, 2010, 22:39 2 Bre:
А использование #pragma в Qt аналогично обычному С++? Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 22:41 2 Bre: Qt это обычная библиотека. Для работы ты используешь обычный C++. Все, что может компилятор, все можно. :)А использование #pragma в Qt аналогично обычному С++? Название: Re: Работа с dll Отправлено: Mityai от Март 15, 2010, 22:47 Qt это обычная библиотека. Для работы ты используешь обычный C++. Все, что может компилятор, все можно. :) Логично. :) Но даже если использовать такой код, это ведь просто создание общих глобальных переменных в dll, если я сегодня не зря прочитал кучу умных вещей и хоть что-то понял. А у меня в примере все же использовался класс, а с ним использование #pragma мне не очень представляется ??? Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 22:51 Логично. :) Но даже если использовать такой код, это ведь просто создание общих глобальных переменных в dll, если я сегодня не зря прочитал кучу умных вещей и хоть что-то понял. А у меня в примере все же использовался класс, а с ним использование #pragma мне не очень представляется ??? Ты лучше расскажи, что ты хочешь получить в результате. :)Название: Re: Работа с dll Отправлено: Mityai от Март 15, 2010, 22:58 Ты лучше расскажи, что ты хочешь получить в результате. :) Как я писал вначале, у меня есть qt-шное приложение, определенная математическая модель, которая в реальном времени производит некоторые расчеты и параметры этой модели постоянно меняются. А есть другие приложения - на qt и MFC, между собой не связанные, которые изменяющиеся параметры этой модели должны обрабатывать и определенным образом преобразовывать для своих нужд. Ну и эта конструкция очень требовательна к временным ресурсам. В общем-то всё :) Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 23:04 Как я писал вначале, у меня есть qt-шное приложение, определенная математическая модель, которая в реальном времени производит некоторые расчеты и параметры этой модели постоянно меняются. А есть другие приложения - на qt и MFC, между собой не связанные, которые изменяющиеся параметры этой модели должны обрабатывать и определенным образом преобразовывать для своих нужд. Ну и эта конструкция очень требовательна к временным ресурсам. В общем-то всё :) Для этого нужно воспользоваться механизмами межпроцессного взаимодействия.Их есть куча всяких разных, какие использовать нужно решать опираясь на те данные, которые необходимо передавать между процессами. Просто тема началась с классов в dll... Вот статейку нашел: http://www.rsdn.ru/article/baseserv/ipc.xml Название: Re: Работа с dll Отправлено: Mityai от Март 15, 2010, 23:17 Для этого нужно воспользоваться механизмами межпроцессного взаимодействия. Их есть куча всяких разных, какие использовать нужно решать опираясь на те данные, которые необходимо передавать между процессами. Просто тема началась с классов в dll... Вот статейку нашел: http://www.rsdn.ru/article/baseserv/ipc.xml Спасибо большое! Правда, сегодня уже наверное не осилю - время не рабочее :) Буду изучать... Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 23:21 Покопать на форуме? Обсуждались тут подобные вещи? Обсуждались.Хочешь, опиши подробней, какие данные должна предоставлять модель для внешних процессов. Думаю, совместно с камрадами, найдем подходящее решение. Название: Re: Работа с dll Отправлено: Mityai от Март 15, 2010, 23:33 Обсуждались. Хочешь, опиши подробней, какие данные должна предоставлять модель для внешних процессов. Думаю, совместно с камрадами, найдем подходящее решение. Почитать все же не поленился... Получается технологий немало. Но вот опять же - если использовать dll или shared memory, нужна синхронизация. Интересно, а тот же OLE/ActiveX или другая технология обязательно требуют подобных вещей? Название: Re: Работа с dll Отправлено: BRE от Март 15, 2010, 23:36 Интересно, а тот же OLE/ActiveX или другая технология обязательно требуют подобных вещей? Ну зачем тебе технологии завязанные на венде? ::)Думаю все можно решить не прибегая к ним. Название: Re: Работа с dll Отправлено: Mityai от Март 15, 2010, 23:39 Ну зачем тебе технологии завязанные на венде? ::) Думаю все можно решить не прибегая к ним. Мне просто не слишком принципиально на Винде или не на Винде :) Все равно ж MFC. Важнее быстрота написания и последующей отладки. Название: Re: Работа с dll Отправлено: Igors от Март 16, 2010, 07:46 Когда создавал этот топик, блаженно веровал в относительную правильность утверждения за номером 1, из чего вполне логично вытекала возможность межпроцессной связи. Однако, теперь я сам не могу понять насколько реально это создать, поэтому Igors, не сочтите за труд нам этот вопрос разъяснить ;D Я имел ввиду очень простую вещь - перекомпилировать нужные модули как dll чтобы обойтись 1 процессом. Если это по задаче подходит - то это гораздо проще и лучше чем любые налаживания взаимодействия между процессами. Правильно ли я понимаю, что ответ на этот вопрос лежит в ответе на первый, а именно в dll shared memory? Если же не подходит и нужны 2 или более процесса - ну тогда все равно можно использовать dll (с разделяемыми данными), но + надо позаботиться о синхронизации. Один процесс должен уметь сказать другому "данные готовы, можно забирать". dll этого не обеспечивает. В Вындоуз часто делают через WaitForSingleObject Название: Re: Работа с dll Отправлено: Mityai от Март 16, 2010, 11:18 Я имел ввиду очень простую вещь - перекомпилировать нужные модули как dll чтобы обойтись 1 процессом. Если это по задаче подходит - то это гораздо проще и лучше чем любые налаживания взаимодействия между процессами. Если же не подходит и нужны 2 или более процесса - ну тогда все равно можно использовать dll (с разделяемыми данными), но + надо позаботиться о синхронизации. Один процесс должен уметь сказать другому "данные готовы, можно забирать". dll этого не обеспечивает. В Вындоуз часто делают через WaitForSingleObject Нет, Igors, такая идея даже в голову не приходила, так как это мне не представляется возможным. В любом случае спасибо, буду разбираться и изучать... |