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

C++

Войти
Регистрация
Восстановить пароль
 
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 485
#1

Как хранить переменную типа char* в named shared memory section? - C++

20.08.2014, 20:00. Просмотров 484. Ответов 8
Метки нет (Все метки)

Во общем есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
extern "C" __declspec(dllexport) void SetOptions(char* string);
 
#pragma data_seg("sms")
char* viewString = "Test1";
#pragma data_seg()
#pragma comment(linker, "/section:sms,RWS")
 
extern "C" __declspec(dllexport)
void SetOptions(char* string = "Test1")
{
    MessageBox(NULL, string, "FromDll", 0); // Выводит правильно
    viewString = string;
    MessageBox(NULL, viewString, "FromDll", 0); // Выводит кракозябры...
}
Как видно по коду используется "Named Shared Memory Section" - "sms".

А проблема в том, что мне компилятор пишет:
"LINK : warning LNK4092: shared writable section 'sms' contains relocations; image may not run correctly"

И когда я присваиваю "viewString = string;" в SetOptions(), то в переменной "viewString" оказывается не мой текст а совершенно какие то рандомные символы(кракозябры)...

Короче нужна помощь...
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
20.08.2014, 23:20     Как хранить переменную типа char* в named shared memory section? #2
Цитата Сообщение от siriusED Посмотреть сообщение
А проблема в том, что мне компилятор пишет:
"LINK : warning LNK4092: shared writable section 'sms' contains relocations; image may not run correctly"
Linker Tools Warning LNK4092
http://msdn.microsoft.com/en-us/libr...=vs.90%29.aspx
C
1
2
int var = 1;
int *pvar = &var;
The linker cannot resolve pvar because its value depends on where the DLL is loaded in
memory, so it puts a relocation record in the DLL. When the DLL is loaded into memory,
the address of var can be resolved and pvar assigned. If another process loads the same
DLL but cannot load it at the same address, the relocation for the address of var will be
updated for the second process and the first process's address space will point to the
wrong address.
Короче, либо использовать опцию /FIXED компоновщика, подавляющую
создание релоков, либо вообще отказаться от shared section (я бы
предпочел последнее).
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 485
21.08.2014, 01:46  [ТС]     Как хранить переменную типа char* в named shared memory section? #3
Реализовал через массив
C++
1
2
3
4
5
6
char viewString[1024] = "Test1";
 
void SetText(char* text)
{
    strncpy_s(viewTest, text, strlen(text));
}
Ну а опция реально решает проблему? или это палка о двух концах, фиксит ошибку и потом нельзя будет использовать разделяемую память?
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
21.08.2014, 08:57     Как хранить переменную типа char* в named shared memory section? #4
Скорее так: фиксит предупреждение компоновщика, и потом нельзя будет
использовать relocations в своей dll.
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 485
21.08.2014, 15:54  [ТС]     Как хранить переменную типа char* в named shared memory section? #5
А что это "relocations"? Типа нельзя будет переопределить переменную в секции?
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
21.08.2014, 19:39     Как хранить переменную типа char* в named shared memory section? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от siriusED Посмотреть сообщение
А что это "relocations"?
У каждого исполняемого образа есть предпочтительный адрес загрузки,
он прописан в его заголовке. Но бывает так, что при загрузке образа
оказывается, что адрес уже чем-то занят, например, другой dll-кой.
И вот тогда системный загрузчик меняет адреса в загружаемом образе так,
чтобы можно было отобразить его в другое место адресного пространства.
И вот для этого нужны релоки. Если они есть - все будет окей.
Если нет - загрузка образа будет завершена с ошибкой.
Для всяких там хуков и прочих динамически подгружаемых образов
наличие релоков очень важно.
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 485
22.08.2014, 16:26  [ТС]     Как хранить переменную типа char* в named shared memory section? #7
Да, это именно кусок кода с D3D хука, ну во общем понятно, значит /FIXED для таких дел не подойдет во обще, ибо на сколько я понял /FIXED бы мог подойти если бы я писал и dll'ку, и exe'шник, и они грузились нормалньно как прописано в заголовке exe'шника, правильно ли я догнал?

Ну и если правильно я догнал тогда получается что когда я пишу секцию в dll'ке с параметром /FIXED тогда может так потом получится что когда я заинжекчу эту dll'ку в чужой процесс то она может тупо вылететь.

Надесь я все правильно догнал..
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
22.08.2014, 18:26     Как хранить переменную типа char* в named shared memory section? #8
Цитата Сообщение от siriusED Посмотреть сообщение
Ну и если правильно я догнал тогда получается что когда я пишу секцию в dll'ке с параметром /FIXED тогда может так потом получится что когда я заинжекчу эту dll'ку в чужой процесс то она может тупо вылететь.
Да, так.
Вот почему я советую забыть про shared-секции и использовать для
обмена данными что-то другое.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 02:24     Как хранить переменную типа char* в named shared memory section?
Еще ссылки по теме:

C++ Очистить переменную типа char *
C++ Как вернуть переменную типа char * из функции
C++ Вывести с помощью printf переменную типа char*
Занести число в переменную, типа char C++
Класс для работы с shared memory C++ Linux

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

Или воспользуйтесь поиском по форуму:
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 485
23.08.2014, 02:24  [ТС]     Как хранить переменную типа char* в named shared memory section? #9
Ну я все таки реализовал через массив char со статическим размером, в принципе нареканий пока что нету, работает адекватно...
Yandex
Объявления
23.08.2014, 02:24     Как хранить переменную типа char* в named shared memory section?
Ответ Создать тему
Опции темы

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