Вообщем нестандартная ситуация в моем коде - нужно заменить классическое использование глобальной переменной (создание в .data секции DWORDA) , на что-то более оригинальное - суть в том чтобы можно было "получить к ней доступ" из любого участка кода и любого потока. На уме у меня только использование какого-то ненужного поля PEB как глобальной переменной - точнее туда записать указатель , на структуру. Может есть у кого-то на примете менее экстремальное решение чем мое ?
ну дык PEB это же не TEB - общая для всего процесса, мне нужна глобальная переменная в рамках одного процесса... да pipe и shared memory имеют место быть , спс за наводку. правда хочется что-то типа создание объекта синхронизации и присвоение его какого-то id ну или что-то в этом духе - еще какие варианты есть ?
Попробуй VirtualAlloc(), там можно указать желаемый адрес, который ты можешь тупо задать константой или какой-нибудь формулой, главное, подобрать такой адрес, который гарантировано не будет занят. Ну или можно использовать именованную секцию, т.е. в точке входа создаёшь секцию через CreateFileMapping(), хендл при этом нигде не сохраняешь ибо негде (у тебя нет глобальных переменных), а далее перед каждым использованием этой памяти секцию придётся открывать заново через OpenFileMapping() и мапить через MapViewOfFile() и только затем использовать, а после закрывать через UnmapViewOfFile() и CloseHandle(). Чуть медленнее, конечно, всё это будет работать, но требований к скорости у тебя вроде бы никаких и нет, не так ли?
Ну как бы хендл-то окна тоже где-то хранить надо. В принципе, окна можно перечислить через EnumThreadWindows(), но тогда ID потока ведь тоже придётся где-то хранить, очень маловероятно, что у него там один поток всего. В общем, тут автору виднее, что использовать, всех особенностей его кода мы не знаем.
Я однажды извратился не слабо по этому поводу. Есть такие функции: GetEnvironmentVariable/SetEnvironmentVariable. Мне надо было иметь один хэндл появившийся в WinMain и на весь процесс. Код (Text): int WINAPI WinMain (...) { ... CHAR value [12]; wsprintfA (value, "%08X", handle); SetEnvironmentVariableA ("Event-007", value); // <-- something like "0023A0F4" ... } Ну и функцию сделал короткую: Код (Text): GetEnvironmentVariableA (...); sscanf (...); Работает из любого потока, DLL, и т.п. Не изящно, и наверное, не быстро, но мои капиталисты довольны.
Тогда уж проще в файл писать, типа current.cfg. И функциональность забацать, типа автосохранение конфига, ручное сохраненние, сохранение под другим именем/чтение другого и т. п. А если под это дело подрядить готовые компоненты работы с XML, то вообще песня.
Dmitry_Milk При таком нагромождении функционала, сами знаете, возможен разрыв связки инструкций push 0x302 / popfd.
я думаю в таком случае уже лучше юзать registerclass и не надо будет создавать окон 100% гарантий нет опять же, но вцелом прорабатываю твое направление с heap* функциями замечательная идея, ты меня даже сбил с курса , а почему ты решил что не быстро ? Сначала я подумал что юзается реестр , потом глянул - исключительно работа с памятью.
KUSER_SHARED_DATA доступна только для чтения в ring3, вообщем пошел я нелегким путем (а даже извращенным) и реализовал через хип менеджер - но довольно таки все красиво и практично получилось в итоге