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

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

Восстановить пароль Регистрация
 
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
31.03.2016, 13:47     Переменная в явно загруженной DLL #1
Здравствуйте!
У меня есть глобально объявленная переменная
C++
1
std::string adres_fayla;
в dll.
Эта ДЛЛ грузится к проекту явно. Как присвоить какое то значение переменной в основной программе?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
31.03.2016, 15:56     Переменная в явно загруженной DLL #2
Экспортируй из dll функцию, которая будет устанавливать значение
этой переменной, и вызывай эту функцию из своей программы.
Olej
 Аватар для Olej
123 / 117 / 13
Регистрация: 25.03.2012
Сообщений: 456
31.03.2016, 16:10     Переменная в явно загруженной DLL #3
Цитата Сообщение от eagl69 Посмотреть сообщение
Как присвоить какое то значение переменной в основной программе?
eagl69 на форуме Сообщить модератору о нарушении
1. использовать данные в shared library - это плохая практика
2. использовать модифицируемые данные в shared library - это вдвойне плохая практика: за счёт механизмов copyy-on-write вы будете разделять новые страницы RAM для библиотеки и множить дубликаты одних и тех же областей данных, используемые разными процессами.
3. но если уж вам так не ймётся работать с именем переменной в shared library - объявите её как external в своём процессе и обращайтесь по имени, как делаете это с именами функций.
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
01.04.2016, 12:55  [ТС]     Переменная в явно загруженной DLL #4
Цитата Сообщение от Olej Посмотреть сообщение
3. но если уж вам так не ймётся работать с именем переменной в shared library - объявите её как external в своём процессе и обращайтесь по имени, как делаете это с именами функций.
Не приведете пример как это сделать?
Цитата Сообщение от Убежденный Посмотреть сообщение
Экспортируй из dll функцию, которая будет устанавливать значение
этой переменной, и вызывай эту функцию из своей программы.
Так не получается, т.к. библиотека загружается несколько раз и при повторной загрузке данные теряются.
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
01.04.2016, 13:33     Переменная в явно загруженной DLL #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. Что не так?
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
01.04.2016, 15:07  [ТС]     Переменная в явно загруженной DLL #6
Попробую подробней описать.... в dll работают "хуки", из *.exe надо передать путь расположения файла в который будут записываться данные. В Вашем примере все работает при разовой загрузке dll. В моем случае этот вариант не работает.
Прописать статический путь файла в dll я не могу, т.к. расположение файла определяется в *.exe.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.04.2016, 15:08     Переменная в явно загруженной DLL #7
может стоит использовать shared memory?
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
02.04.2016, 11:22  [ТС]     Переменная в явно загруженной DLL #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 всегда равен нулю... не открывается.....?
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
02.04.2016, 13:36     Переменная в явно загруженной DLL #9
Для создания MMF-объекта в глобальном пространстве имен нужна
привилегия SE_CREATE_GLOBAL_NAME, она только у администраторов и служб.
Поэтому CreateFileMapping завершается ошибкой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2016, 14:05     Переменная в явно загруженной DLL
Еще ссылки по теме:

C++ Использование загруженной БД в разных пунктах меню
C++ Как можно явно вызвать оператор преобразования?
Переменная или переменная и условие C++

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

Или воспользуйтесь поиском по форуму:
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 440
02.04.2016, 14:05  [ТС]     Переменная в явно загруженной DLL #10
Цитата Сообщение от eagl69 Посмотреть сообщение
TCHAR szName[] = TEXT("Global \\ MyFileMappingObject");
Долго пробовал.... но изменив эту строчку из примера на:
C++
1
TCHAR szName[] = TEXT("MyFileMappingObject");
Заработало...
Yandex
Объявления
02.04.2016, 14:05     Переменная в явно загруженной DLL
Ответ Создать тему
Опции темы

Текущее время: 23:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru