Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [DLL] data_seg() - struct - class, Использование своей секции/данных во все 
:(
    Опции темы
MuForum
Дата 4.11.2010, 01:58 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброго времени суток.
На днях появилась задача: Создать .dll, которая будет перехватывать все нажатия клавиатуры в системе. Другими словами глобальный хук.
Необходимо было передавать в *.dll имя класса и имя окна, для дальнейшей обработки.
Естественно для этих целей должны были быть глобальный переменные, которые смогут использовать всем загруженные программы.

Помучившись с сохранением данных, наткнулся на data_seg() - Выделением собственной секции для данных.
Наткнувшись на подводные камни, решил описать их.


# Общий шаблон:
Код

#pragma data_seg("MySectionName")
char szName[256] = "";
float fValue;
int iValuel = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:MySectionName, RWS")


Начнёмс...

Во-первых: Обращаю ваше внимание на тот факт, что в нашей секции будут лишь те переменные, которые изначально будут инициализированы!!!
- То есть, переменная fValue будет в контексте каждой программы иметь свои значения!
Во-вторых: Так же может встать вопрос, а как создать класс, чтобы он тоже имел одну область памяти в контексте всех программ?
Код

class MyClass
{
public:
MyClass() {};
~MyClass() {};
char szName[256];
float fValue;
int iValuel ;
}

#pragma data_seg("MySectionName")
MyClass g_Class;
#pragma data_seg()
#pragma comment(linker,"/SECTION:MySectionName, RWS")

- Надо заметить, что это будет бесполезная трата времени, так как класс будет у всех контекстов иметь разную область памяти.
- Необходимо осуществить инициализацию класса, то есть, вызвать конструктор класса(не стандартный), а передав какие-то данные.
Код

class MyClass
{
public:
MyClass() {};
MyClass(int a) {};
~MyClass() {};
char szName[256];
float fValue;
int iValuel ;
}

#pragma data_seg("MySectionName")
MyClass g_Class(10);
#pragma data_seg()
#pragma comment(linker,"/SECTION:MySectionName, RWS")

- В таком случае всё будет нормально, и мы сможем использовать наш класс в контекстах всех программ.


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


P.S. -> Надеюсь кому-то пригодится.
- Тему создал собственно по той причине, что заколебался создавать глобальные переменные, получается каша...

Это сообщение отредактировал(а) MuForum - 4.11.2010, 11:54


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
BorisVorontsov
Дата 4.11.2010, 13:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



Цитата(MuForum @  4.11.2010,  01:58 Найти цитируемый пост)
Начнёмс...

Изучать все методом тыка, должно быть, очень занимательно, но ведь все описано в MSDN
Цитата(MSDN)

There are restrictions to consider before using a shared data segment:

Any variables in a shared data segment must be statically initialized. In the above example, i is initialized to 0 and a is 32 characters initialized to hello world.

All shared variables are placed in the compiled DLL in the specified data segment. Very large arrays can result in very large DLLs. This is true of all initialized global variables.

Never store process-specific information in a shared data segment. Most Win32 data structures or values (such as HANDLEs) are really valid only within the context of a single process.

Each process gets its own address space. It is very important that pointers are never stored in a variable contained in a shared data segment. A pointer might be perfectly valid in one application but not in another.

It is possible that the DLL itself could get loaded at a different address in the virtual address spaces of each process. It is not safe to have pointers to functions in the DLL or to other shared variables.

Note that these last three points apply to memory-mapped files and shared data segments.


Цитата(MuForum @  4.11.2010,  01:58 Найти цитируемый пост)
Вот со структурой я так и не разобрался, скорее всего и не получится, так как как структуру инициализировать я себе не представляю.

Структура в C++ ничем не отличается от класса, за исключением области видимости по-умолчанию для членов



--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
xvr
Дата 5.11.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Кстати, вам сильно повезло, что класс с конструктором лег в инициализированную секцию. Может и не лечь (даже если просто поменять уровень оптимизаций). 
Структуру (точнее POD структуру), кстати, точно можно разместить таким образом:
Код

struct S {
 int a;
 int b;
 int c;
};

#pragma data_seg("MySectionName")
S s = {1,2,3};


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.