Russian Qt Forum
Ноябрь 27, 2024, 02:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Работа с dll  (Прочитано 10864 раз)
Mityai
Гость
« : Март 15, 2010, 16:12 »

Доброго всем времени суток! Хотелось бы задать несколько вопросов...

1) Правильно ли я понимаю, что если мы прописываем класс в dll, то у нас вне зависимости от количества подключенных приложений создается один общий для них всех кусок адресного пространства с одним объектом этого самого dll-класса для каждого приложения?

2) Пытался найти пример реализации класса в dll и работы с ним на форуме, но что-то так и не нашел. Смотрел топик и пример от "Eugene Efremov" из "Вики", но там вроде как этот объект класса из dll явно создается... Или иначе сделать невозможно? С dll работаю 2-ой день можно сказать, вот маленький пример моего кода.

main
Код:
QLibrary lib("dynlib");
    if (lib.load())
    {
          //вот тут хотелось бы обращаться к методам класса
    }

dynlib.cpp
Код:
#include "dynlib.h"

Dynlib::Dynlib()
{
    l = 55;
}
int Dynlib::GetValue()
{
    return l;
}

dynlib.h
Код:
#ifndef DYNLIB_H
#define DYNLIB_H

#include "dynlib_global.h"

class DYNLIBSHARED_EXPORT Dynlib
{
public:
    Dynlib();
    int GetValue();

private:
    int l;

};

#endif // DYNLIB_H

Библиотеку создавал в конструкторе.

3) Есть несколько приложений - некоторые написаны на Qt, некоторые на MFC (MSVS 2005). Хотелось бы организовать обмен данными между ними. Насколько удобно это делать через dll, во что это может вылезти при унификации кода и есть ли какая-то альтернатива? Вся система приложений критична во времени и обмен должен происходить быстро.

Прошу меня простить, если я совсем чайник, не вижу очевидных вещей и не умею копаться в форуме. Если кинете мне ссылки на материалы, в которых есть ответы на эти вопросы, буду очень благодарен! Спасибо!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Март 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).
Записан
BRE
Гость
« Ответ #2 : Март 15, 2010, 17:16 »

3) Есть несколько приложений - некоторые написаны на Qt, некоторые на MFC (MSVS 2005). Хотелось бы организовать обмен данными между ними. Насколько удобно это делать через dll, во что это может вылезти при унификации кода и есть ли какая-то альтернатива? Вся система приложений критична во времени и обмен должен происходить быстро.
dll неприменимы между 32 и 64 битными приложениями. Во всех остальных случаях (если дело происходит на 1 машине) они удобнее и быстрее чем все остальное (сокеты, сигналы, shared memory).
Как можно использовать dll для обмена данными между приложениями?
И как можно сравнивать dll и средства межпроцессного взаимодействия?
 Строит глазки
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 15, 2010, 18:09 »

Как можно использовать dll для обмена данными между приложениями?
И как можно сравнивать dll и средства межпроцессного взаимодействия?
Есть "обмен данными" и есть "синхронизация" - это разные вещи
Записан
BRE
Гость
« Ответ #4 : Март 15, 2010, 18:26 »

Как можно использовать dll для обмена данными между приложениями?
И как можно сравнивать dll и средства межпроцессного взаимодействия?
Есть "обмен данными" и есть "синхронизация" - это разные вещи
А какое отношение к этому имеют dll?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 15, 2010, 18:43 »

А какое отношение к этому имеют dll?
Прямое  Улыбающийся
Записан
BRE
Гость
« Ответ #6 : Март 15, 2010, 18:46 »

Прямое  Улыбающийся
Объясни пожалуйста, как с помощью разделяемой библиотеки можно обмениваться данными между приложениями?  Подмигивающий
Записан
Mityai
Гость
« Ответ #7 : Март 15, 2010, 22:15 »

2 Bre & Igors

Когда создавал этот топик, блаженно веровал в относительную правильность утверждения за номером 1, из чего вполне логично вытекала возможность межпроцессной связи. Однако, теперь я сам не могу понять насколько реально это создать, поэтому Igors, не сочтите за труд нам этот вопрос разъяснить Смеющийся

Правильно ли я понимаю, что ответ на этот вопрос лежит в ответе на первый, а именно в dll shared memory?
« Последнее редактирование: Март 15, 2010, 22:20 от Mityai » Записан
BRE
Гость
« Ответ #8 : Март 15, 2010, 22:37 »

2 Bre & Igors

Когда создавал этот топик, блаженно веровал в относительную правильность утверждения за номером 1, из чего вполне логично вытекала возможность межпроцессной связи. Однако, теперь я сам не могу понять насколько реально это создать, поэтому Igors, не сочтите за труд нам этот вопрос разъяснить Смеющийся

Правильно ли я понимаю, что ответ на этот вопрос лежит в ответе на первый, а именно в dll shared memory?
Думаю имелось ввиду следующее:
Код
C++ (Qt)
#pragma data_seg( "shareddata" )
int var = 10;
char str[ 1024 ] = { 0 };
#pragma data_seg()
#pragma comment(linker,"/SECTION:shareddata,RWS")
 

Но это такой же механизм, который использует QSharedMemory.
Записан
Mityai
Гость
« Ответ #9 : Март 15, 2010, 22:39 »

2 Bre:

А использование #pragma в Qt аналогично обычному С++?
Записан
BRE
Гость
« Ответ #10 : Март 15, 2010, 22:41 »

2 Bre:

А использование #pragma в Qt аналогично обычному С++?
Qt это обычная библиотека. Для работы ты используешь обычный C++. Все, что может компилятор, все можно.  Улыбающийся
Записан
Mityai
Гость
« Ответ #11 : Март 15, 2010, 22:47 »

Qt это обычная библиотека. Для работы ты используешь обычный C++. Все, что может компилятор, все можно.  Улыбающийся

Логично.  Улыбающийся Но даже если использовать такой код, это ведь просто создание общих глобальных переменных в dll, если я сегодня не зря прочитал кучу умных вещей и хоть что-то понял. А у меня в примере все же использовался класс, а с ним использование #pragma мне не очень представляется Непонимающий
Записан
BRE
Гость
« Ответ #12 : Март 15, 2010, 22:51 »

Логично.  Улыбающийся Но даже если использовать такой код, это ведь просто создание общих глобальных переменных в dll, если я сегодня не зря прочитал кучу умных вещей и хоть что-то понял. А у меня в примере все же использовался класс, а с ним использование #pragma мне не очень представляется Непонимающий
Ты лучше расскажи, что ты хочешь получить в результате.  Улыбающийся
Записан
Mityai
Гость
« Ответ #13 : Март 15, 2010, 22:58 »

Ты лучше расскажи, что ты хочешь получить в результате.  Улыбающийся

Как я писал вначале, у меня есть qt-шное приложение, определенная математическая модель, которая в реальном времени производит некоторые расчеты и параметры этой модели постоянно меняются. А есть другие приложения - на qt и MFC, между собой не связанные, которые изменяющиеся параметры этой модели должны обрабатывать и определенным образом преобразовывать для своих нужд. Ну и эта конструкция очень требовательна к временным ресурсам. В общем-то всё Улыбающийся
Записан
BRE
Гость
« Ответ #14 : Март 15, 2010, 23:04 »

Как я писал вначале, у меня есть qt-шное приложение, определенная математическая модель, которая в реальном времени производит некоторые расчеты и параметры этой модели постоянно меняются. А есть другие приложения - на qt и MFC, между собой не связанные, которые изменяющиеся параметры этой модели должны обрабатывать и определенным образом преобразовывать для своих нужд. Ну и эта конструкция очень требовательна к временным ресурсам. В общем-то всё Улыбающийся
Для этого нужно воспользоваться механизмами межпроцессного взаимодействия.
Их есть куча всяких разных, какие использовать нужно решать опираясь на те данные, которые необходимо передавать между процессами.

Просто тема началась с классов в dll...

Вот статейку нашел: http://www.rsdn.ru/article/baseserv/ipc.xml
« Последнее редактирование: Март 15, 2010, 23:08 от BRE » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.119 секунд. Запросов: 23.