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

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

Войти
Регистрация
Восстановить пароль
 
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
#1

Переменная в явно загруженной DLL - C++

31.03.2016, 13:47. Просмотров 261. Ответов 9
Метки нет (Все метки)

Здравствуйте!
У меня есть глобально объявленная переменная
C++
1
std::string adres_fayla;
в dll.
Эта ДЛЛ грузится к проекту явно. Как присвоить какое то значение переменной в основной программе?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2016, 13:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переменная в явно загруженной DLL (C++):

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

Глобальная переменная из другой dll - C++
Имеется сторонняя dll без исходников. Мне нужно в своей программе получить значение глобальной переменной из той длл. Через IDA нашел,...

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++
Исходники: /* main.cpp */ #include "hider.h" int main(void) { return 0; } /* foo.cpp */

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

Определение загруженной копии приложения в Win32 - C++
Довольно избитая тема, но интересует мнение профессионалов: как лучше в Win32 определнить загружено приложение уже или нет? При чем место...

Использование загруженной БД в разных пунктах меню - C++
Всем добрый вечер! Есть задание-создать БД кинолога в С++. БД создана, всё работает. Один из пунктов меню БД -- "Загрузить БД", что...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
31.03.2016, 15:56 #2
Экспортируй из dll функцию, которая будет устанавливать значение
этой переменной, и вызывай эту функцию из своей программы.
0
Olej
Заблокирован
31.03.2016, 16:10 #3
Цитата Сообщение от eagl69 Посмотреть сообщение
Как присвоить какое то значение переменной в основной программе?
eagl69 на форуме Сообщить модератору о нарушении
1. использовать данные в shared library - это плохая практика
2. использовать модифицируемые данные в shared library - это вдвойне плохая практика: за счёт механизмов copyy-on-write вы будете разделять новые страницы RAM для библиотеки и множить дубликаты одних и тех же областей данных, используемые разными процессами.
3. но если уж вам так не ймётся работать с именем переменной в shared library - объявите её как external в своём процессе и обращайтесь по имени, как делаете это с именами функций.
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
01.04.2016, 12:55  [ТС] #4
Цитата Сообщение от Olej Посмотреть сообщение
3. но если уж вам так не ймётся работать с именем переменной в shared library - объявите её как external в своём процессе и обращайтесь по имени, как делаете это с именами функций.
Не приведете пример как это сделать?
Цитата Сообщение от Убежденный Посмотреть сообщение
Экспортируй из dll функцию, которая будет устанавливать значение
этой переменной, и вызывай эту функцию из своей программы.
Так не получается, т.к. библиотека загружается несколько раз и при повторной загрузке данные теряются.
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
01.04.2016, 13:33 #5
Цитата Сообщение от eagl69 Посмотреть сообщение
Так не получается, т.к. библиотека загружается несколько раз и при повторной загрузке данные теряются.
Ты или что-то недописал в сообщении #1, или я тебя не понял.
Вот у меня есть dll:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>
#include <Windows.h>
 
BOOL _stdcall DllMain(HMODULE hm, DWORD Reason, PVOID Reserved)
{
    return TRUE;
}
 
std::string g_Value;
 
__declspec(dllexport)
void _stdcall SetValue(char const * pValue)
{
    g_Value = pValue;
}
Я загружаю dll (LoadLibrary), нахожу в ней адрес функции SetValue (GetProcAddress),
затем вызываю функцию. Все, значение записано в g_Value. Что не так?
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
01.04.2016, 15:07  [ТС] #6
Попробую подробней описать.... в dll работают "хуки", из *.exe надо передать путь расположения файла в который будут записываться данные. В Вашем примере все работает при разовой загрузке dll. В моем случае этот вариант не работает.
Прописать статический путь файла в dll я не могу, т.к. расположение файла определяется в *.exe.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.04.2016, 15:08 #7
может стоит использовать shared memory?
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
02.04.2016, 11:22  [ТС] #8
Я вот думаю еще над вариантом, сделать еще одну dll которая будет подключаться к *.exe и к основной dll. Что будет работать быстрее? этот вариант или hared memory?

Добавлено через 18 часов 8 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
может стоит использовать shared memory?
Пытался сделать.....:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TCHAR szName[] = TEXT("Global \\ MyFileMappingObject");
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // use paging file
        NULL,                    // default security
        PAGE_READWRITE,          // read/write access
        0,                       // maximum object size (high-order DWORD)
        256,                // maximum object size (low-order DWORD)
        szName);
    pBuf = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
                                 FILE_MAP_ALL_ACCESS, // read/write permission
                                 0,
                                 0,
                                 256);
    CopyMemory((PVOID)pBuf, put_fayl_.c_str(), put_fayl_.size());
Но почему то hMapFile = CreateFileMapping всегда равен нулю... не открывается.....?
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
02.04.2016, 13:36 #9
Для создания MMF-объекта в глобальном пространстве имен нужна
привилегия SE_CREATE_GLOBAL_NAME, она только у администраторов и служб.
Поэтому CreateFileMapping завершается ошибкой.
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
02.04.2016, 14:05  [ТС] #10
Цитата Сообщение от eagl69 Посмотреть сообщение
TCHAR szName[] = TEXT("Global \\ MyFileMappingObject");
Долго пробовал.... но изменив эту строчку из примера на:
C++
1
TCHAR szName[] = TEXT("MyFileMappingObject");
Заработало...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2016, 14:05
Привет! Вот еще темы с ответами:

Изменение формы загруженной картинки, OpenGL - C++
Здравствуйте. Я давно на этом форуме и почти все ответы по программированию нашел здесь(исключая конечно основы). Но я столкнулся с одной...

Как явно преобразовать указатель? - C++
Здравствуйте! Изучая возможности наследования столкнулся со следующим утверждением: &quot;Если для объекта производного класса объявить...

Переменная или переменная и условие - C++
Привет всем. Стало интересно. Есть предположим функция. В ней ссылкой передается аргумент Status; Как лучше сделать? ...

Почему работают методы явно не созданного объекта - C++
Привет. Беглый поиск не дал ответа на вопрос, почему работает нижеприведённый код: class SomeClass { public: ...


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

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

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