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

C++

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

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

20.08.2014, 20:00. Просмотров 519. Ответов 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" оказывается не мой текст а совершенно какие то рандомные символы(кракозябры)...

Короче нужна помощь...
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2014, 20:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как хранить переменную типа char* в named shared memory section? (C++):

Может ли char хранить русские символы? - C++ Builder
Доброго времени суток! Просьба прояснить некоторые нюансы. Допустим мне нужна однобайтовая кодировка русских букв. char может хранить в...

Как вводить и выводить данные с Edit типа char? - C++ Builder
Подскажите пожалуйста как вводить и выводить данные с Edit типа char. Например с float это я делал так N=StrToFloat(Edit1->Text); ...

Как правильно передать переменную типа UnicodeString? - C++ Builder
Привет друзья. Название темы вроде бы простое, но я сдался. В общем есть проект, в Builder 2009\2010 всё работает без проблем, а в XE2...

Как перенести переменную типа TStringList в другой модуль - C++ Builder
Как перенести глобальную переменную типа TStringList в другой модуль (Unit2 например), чтобы она при этом сохранила свое значение? ...

Как достать из массива char переменные типа double, int, bool - C++ Builder
Имеется массив char temp. в этот массив записана переменная double (начинается ,например, с temp), переменные типа bool и int. как их...

Как записать в переменную целочисленного типа выбранный элемент ComboBox? - C++ Builder
Как записать в переменную целочисленного типа выбранный элемент из списка?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
20.08.2014, 23:20 #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 (я бы
предпочел последнее).
1
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 500
21.08.2014, 01:46  [ТС] #3
Реализовал через массив
C++
1
2
3
4
5
6
char viewString[1024] = "Test1";
 
void SetText(char* text)
{
    strncpy_s(viewTest, text, strlen(text));
}
Ну а опция реально решает проблему? или это палка о двух концах, фиксит ошибку и потом нельзя будет использовать разделяемую память?
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
21.08.2014, 08:57 #4
Скорее так: фиксит предупреждение компоновщика, и потом нельзя будет
использовать relocations в своей dll.
1
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 500
21.08.2014, 15:54  [ТС] #5
А что это "relocations"? Типа нельзя будет переопределить переменную в секции?
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
21.08.2014, 19:39 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от siriusED Посмотреть сообщение
А что это "relocations"?
У каждого исполняемого образа есть предпочтительный адрес загрузки,
он прописан в его заголовке. Но бывает так, что при загрузке образа
оказывается, что адрес уже чем-то занят, например, другой dll-кой.
И вот тогда системный загрузчик меняет адреса в загружаемом образе так,
чтобы можно было отобразить его в другое место адресного пространства.
И вот для этого нужны релоки. Если они есть - все будет окей.
Если нет - загрузка образа будет завершена с ошибкой.
Для всяких там хуков и прочих динамически подгружаемых образов
наличие релоков очень важно.
1
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 500
22.08.2014, 16:26  [ТС] #7
Да, это именно кусок кода с D3D хука, ну во общем понятно, значит /FIXED для таких дел не подойдет во обще, ибо на сколько я понял /FIXED бы мог подойти если бы я писал и dll'ку, и exe'шник, и они грузились нормалньно как прописано в заголовке exe'шника, правильно ли я догнал?

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

Надесь я все правильно догнал..
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
22.08.2014, 18:26 #8
Цитата Сообщение от siriusED Посмотреть сообщение
Ну и если правильно я догнал тогда получается что когда я пишу секцию в dll'ке с параметром /FIXED тогда может так потом получится что когда я заинжекчу эту dll'ку в чужой процесс то она может тупо вылететь.
Да, так.
Вот почему я советую забыть про shared-секции и использовать для
обмена данными что-то другое.
0
siriusED
19 / 19 / 3
Регистрация: 20.05.2010
Сообщений: 500
23.08.2014, 02:24  [ТС] #9
Ну я все таки реализовал через массив char со статическим размером, в принципе нареканий пока что нету, работает адекватно...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 02:24
Привет! Вот еще темы с ответами:

Как бы завести свою переменную(или объект?) типа TComboBox? - C++ Builder
Есть несколько ComboBox-ов, от котрых требуется буквально одно и тоже, возникает желание написать функцию, но одним из параметров в ней...

Преобразование строкового типа в переменную типа float - C++ Builder
Как в программе С++ Builder6 преобразовать строковый тип числа взятого из компонента StringGrid1->Cells в переменную типа float, чтобы...

Creating Named Shared Memory - Visual C++
Здравствуйте. Пытаюсь освоить работу с общей памятью двух разных программ, используя FileMapping, всё делаю как в ссылке, но в первой...

Shared memory - Visual C++
Микроконтроллер загружает необходимую информацию в shared memory по заранее известным адресам. Как считать/получить доступ к этой инфе из...


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

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

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