Добрый день всем!
Я занимаюсь написанием некоторого "фильтра" сообщений в Win32 с помощью технологии хуков на С++ в чистом API для компилятора gcc. Сам фильтр реализован в виде класса Hook. Те, кто занимался хуками знают, о праблеме распределенной памяти для подключаемых к dll процессам.
Моя праблема:
Мне нужно разместить мой класс в shared секцию так, чтобы он был общим для всех процессов (Если возможно реализовать это другим способом, то напишите как). Также, класс использует динамическую память (например для строк или структур: LPSTR s = (LPSTR)new LPSTR[size]), которая тоже должна быть общей.
Я проанализировал возможности gcc связанные с созданием shared секций. Они создаются слудующим образом (для моего случая):
Hook hook __attribute__((section ("section_name"), shared)) = Hook::Hook();
Но при подключении нового процесса к моей hook.dll, конструктор и деструктор вызываются снова, а переменные этого класса
не меняют своего значения.
Я думаю, что можно использовать следующие способы:
— File Mapping. Положить туда свой класс и все динамические данные (объясните как это реализовать).
— С помощью опции линкера --stack=<размер>, указать область побольше и размещать мой класс и все динамические данные в shared секции. (тогда возникает вопрос: "а как выделять память в shared секции?")[/list]
— DDE
Хотелось бы использовать наименее сложный способ.
P.S. Если вы не программировали на gcc, но знаете как это реализовать на Visual C++, помогите всё равно.
Спасибо.
Здравствуйте, DeadbraiN, Вы писали:
В shared секции можно размещать только POD данные. То есть классы нельзя. Но можно размещать инициализированные переменные
__declspec(shared) bool isAlreadyInitialized = false;
Выделять память динамически можно только импользую Memory Mapped Files. Когда я решал эту проблему, мне оказалось проще сделать большой статический массив of char и использовать его.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, DeadbraiN, Вы писали:
A>В shared секции можно размещать только POD данные. То есть классы нельзя. Но можно размещать инициализированные переменные
A>A>__declspec(shared) bool isAlreadyInitialized = false;
A>
A>Выделять память динамически можно только импользую Memory Mapped Files. Когда я решал эту проблему, мне оказалось проще сделать большой статический массив of char и использовать его.
Хорошо, но где мне найти стоющую информацию о MMF?
Заранее спасибо.
Здравствуйте, DeadbraiN, Вы писали:
DN>Хорошо, но где мне найти стоющую информацию о MMF?
DN>Заранее спасибо.
У Рихтера.
... << RSDN@Home 1.1.2 stable >>
Здравствуйте, DeadbraiN, Вы писали:
DN>Здравствуйте, adontz, Вы писали:
DN>Хорошо, но где мне найти стоющую информацию о MMF?
DN>Заранее спасибо.
MSDN, wasm.ru