Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DmitryE
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 8
#1

Подскажите как хранить перемененные в DLL - C++

30.03.2014, 02:04. Просмотров 539. Ответов 9
Метки нет (Все метки)

Здравствуйте.

Я пишу dll функционал которой в приеме данных из одной программы (в которой будет вызвана соответствующая функция по передаче данных в dll) и передача в другую программу при вызове функции из этой другой программы.

Данные в dll необходимо как-то хранить между приемом и передачей и знать наименование хранимой переменной в dll для запроса в функции именно этой переменной, может ли быть таких хранимых переменнных 10 шт (?), прошу подсказать способ ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 02:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите как хранить перемененные в DLL (C++):

как хранить данные в dll - C++
подскажите, возможно ли, и как хранить данные в dll? например не хочу чтоб логин пароль и некоторая другая информация была в текстовом...

Народ подскажите, чета я забыл DLL как экспортировать - C++
Вот например есть в DLL код функции: void OpenAbout(HINSTANCE hInst, int cmdMode, HWND hWnds) { .... return; }

Подскажите пожалуйста с динамической DLL библиотекой - C++
1. Разработка DLL библиотеки.// MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: static...

Как узнать путь к загруженной DLL из самой DLL? - C++
Создаю небольшую программку в папке c:/test/app/, есть DLL в папке c:/test/dll/. В коде самой dll, после её подгрузки в программу, можно...

Как узнать зависимость DLL-ки от других DLL-ек? - C++
Есть DLL-ка, она в свою очередь подгружает другие DLL-ки, а так же использует соответственно тулфейн свого компилятора и тд. Есть какая...

Как подключить dll на C# к проекту (dll) на С++ - C++
Подскажите, пожалуйста, как подключить dll на C# к проекту (dll) на С++. В интернете много примеров, где показаны примеры по подключению...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
30.03.2014, 02:19 #2
Может я что-то не знаю, но... Почему должно быть нельзя?

Добавлено через 43 секунды
Создаете в .h файле переменную и записываете туда. В чём проблема?
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 02:35 #3
Здравствуйте, если Вы планируете сначала запустить программу А, которая динамически линкуется с Вашей dll, и вызовет некоторые методы у неё - установив значения переменных - а потом другая программа Б, так-же динамически линкуясь с Вашей dll вызовет у неё другие методы - пытаясь получить значения переменных - то без дополнительных "внешних" хранилищ такая реализация не осуществима. Хотя-бы по тому, что у двух разных запущенных программ разное адресное пространство - и dll в данном случае просто экспортирует свой функционал в Ваше приложение, но инициализироваться данные будут для каждой программы по-отдельности.
Или же я не совсем верно понял Ваш вопрос?
1
DrOffset
7138 / 4279 / 964
Регистрация: 30.01.2014
Сообщений: 7,067
30.03.2014, 02:41 #4
Цитата Сообщение от MastAKK Посмотреть сообщение
Создаете в .h файле переменную и записываете туда.
Если этот файл подключается в dll и в клиентское приложение, то будет две переменных, одна в dll в месте подключения, другая в приложении - в месте подключения. Поэтому переменные из dll нужно экспортировать. То есть определяется она где-то в cpp dll, а в h-файле определяется ее экспорт или импорт в зависимости от того кто его подключает (приложение или dll). Либо можно сделать функцию для доступа к этой переменной, но функцию тоже нужно экспортировать.

Добавлено через 5 минут
А Melg абсолютно прав в своей оценке. "Расшаривать" переменные через dll между разными процессами не получится без дополнительных "внешних" хранилищ.
2
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
30.03.2014, 02:41 #5
DrOffset, не знал. Надо получить теорию, с библиотеками пока что ни разу не возился
0
DmitryE
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 8
30.03.2014, 02:48  [ТС] #6
Я еще не очень хорошо программирую, попробую описать суть.

Одна программа вызывает функцию DLL с указанием наименования переменнойсоздаваемой в dll для хранения и грузит данные в эту переменную.

Вторая программа вызывет функцию dll с указанием наименования переменной которую нужно загрузить из памяти, что-бы забрать из нее данные.

Все верно ?

p.s. Я читаю в интернете на тему хранения и передачи данных в dll и тут вот такие методы предлагают (Называется вроде как SharedMemory):

C++
1
2
3
4
5
6
7
8
9
  #pragma data_seg (“.MySeg”)
 
        int sharedInts[5]={0,0,0,0,0}; // переменная общего пользования
        // другие переменные общего пользования
 
        . . .
        #pragma data_seg ()
 
        #pragma comment (lib, ”msvcrt” “-SECTION: .MySeg, rws”);
И еще вопрос, как создавать в коде dll дополнительные переменные с названием взятым из параметров в вызываемой функции dll ? Что-бы потом к ним можно было обращаться при вызове другой функции DLL.
0
DrOffset
7138 / 4279 / 964
Регистрация: 30.01.2014
Сообщений: 7,067
30.03.2014, 02:58 #7
Цитата Сообщение от DmitryE Посмотреть сообщение
Я читаю в интернете на тему хранения и передачи данных в dll и тут вот такие методы предлагают
То, что описано в этом методе и есть те самые дополнительные ухищрения Мы тут создаем сегмент свой и помечаем его как shared (в rws - s - значит shared, r - read, w - write). То есть это один из вариантов shared memory. Короче, работать будет.

Добавлено через 5 минут
Цитата Сообщение от DmitryE Посмотреть сообщение
И еще вопрос, как создавать в коде dll дополнительные переменные с названием взятым из параметров в вызываемой функции dll ? Что-бы потом к ним можно было обращаться при вызове другой функции DLL.
Придумать какой-то свой способ адресации. Например, если передаются строки, которые содержат имена, то где-то в dll может быть контейнер, который свяжет эти строки с адресами реальных переменных - только что созданных или уже существующих. Ассоциативные массивы тебе помогут в этом. Реализаций много, в std есть, например, map.
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 02:59 #8
Кажется я нашел эту статью http://www.ishodniki.ru/art/art_progr/builder/224.html
Это специализированная для win32 техника, подробнее описана тут:
http://msdn.microsoft.com/ru-ru/libr...(v=vs.90).aspx
Всё, что Вы напишите в коде будет "высечено топором" на этапе компиляции - и в рантайме меняться не будет (так в частности и имена переменных). Для того чтобы можно было из параметров функций взять "название переменной" вам потребуется хранить некоторый контейнер - содержащий в себе строку названия в качестве ключа и значения переменной в в качестве данных.
0
DmitryE
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 8
30.03.2014, 03:30  [ТС] #9
Позвольте еще один вопрос.

Можно будет ли работать такая конструкция в теле функции, т.е.:

C++
1
2
3
4
5
6
7
8
9
DLLAPI int __stdcall TransferVariableToDll(double &VariableM, int &varialbeleght, char &Varialblename)
{
 
#pragma data_seg (“.Variablesegm”)
 
int Variablename[varialbeleght]={VariableM};
 
#pragma data_seg () 
}
Можно ли будет эту переменную теперь получить из памяти вызовом следующей функции:
C++
1
2
3
4
5
DLLAPI int __stdcall TransferVariableFromDLL(char &NameOfVariableToExport, double &ExportVariableData)
{
 
ExportVariableData =  NameOfVariableToExport
}
Добавлено через 15 минут
Спасибо всем за ответы !!!

Правильно ли я понял, что создавать динамически расшаренные переменные в коде dll будет нельзя ?

т.е. таким кодом:

C++
1
2
3
4
5
6
7
8
9
DLLAPI int __stdcall TransferVariableToDll(double &VariableM, int &varialbeleght, char &Varialblename)
{
 
#pragma data_seg (“.Variablesegm”)
 
int Variablename[varialbeleght]={VariableM};
 
#pragma data_seg () 
}
Добавлено через 1 минуту
Это специализированная для win32 техника
Будет ли эта техника работать в Windows x64 ?

Добавлено через 6 минут
Придумать какой-то свой способ адресации. Например, если передаются строки, которые содержат имена, то где-то в dll может быть контейнер, который свяжет эти строки с адресами реальных переменных - только что созданных или уже существующих. Ассоциативные массивы тебе помогут в этом. Реализаций много, в std есть, например, map.
Вопрос - создать реальную переменную в коде dll возможно ? Ведь для шаредмемори я как понял нужно знать еще длинну переменной и ее тип и на момент компиляции ее выяснить нельзя.
0
KOPOJI
30.03.2014, 12:25     Подскажите как хранить перемененные в DLL
  #10
 Комментарий модератора 
Кросспостинг http://www.cyberforum.ru/order-progr...ad1133392.html.
Закрыто.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 12:25
Привет! Вот еще темы с ответами:

как хранить поток? - C++
задача такая: класс имеет конструктор, этому конструктору при создании объекта класса передаёться поток ostream , соответственно объект...

Как хранить размерность массива? - C++
Здравствуйте. Мне нужно решить задачу: template < class T, size_t N> std::size_t length(const T (&)) { return N; }; ...

Как хранить координаты фигуры? - C++
Что нужно сделать: при запуске программы в центре рисуется прямоугольник, в меню есть 4 кнопки: растянуть влево, вправо, вверх, вниз...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.03.2014, 12:25
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru