Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизХранение данных в dll, используемой несколькими процессами Найти похожие ветки
← →
EgorovAlex © (2012-07-27 09:20) [0]Где хранить уникальные для каждого процесса данные?
Пока есть такая мысль: создать запись
record
PID: // Id процесса
... данные
end;
создать массив из таких записей и в dll пробегать по этому массиву, находить свой Id и оттуда брать свои данные.
Или есть более правильный и быстрый способ?
← →
brother © (2012-07-27 09:24) [1]const
ID1: блабла
ID2: блабла
?
← →
EgorovAlex © (2012-07-27 09:31) [2]Не понял, вот есть у меня, скажем FileName: string; оно для разных окон должно иметь разные значения, как их хранить?
← →
MBo © (2012-07-27 09:39) [3]У каждого процесса свое адресное пространство. Так что данные будут только свои родные, если не предпринимать специальный усилий.
← →
EgorovAlex © (2012-07-27 09:41) [4]А не, я похоже не так выразился, процесс один у меня - explorer.exe, а окна разные
← →
Медвежонок Пятачок © (2012-07-27 09:55) [5]если процесс один, то в чем проблема?
← →
EgorovAlex © (2012-07-27 09:55) [6]Блин, в этом случае всё сложнее, как данные разделять-то? Есть идеи?
← →
EgorovAlex © (2012-07-27 09:56) [7]Проблема: разные окна - разные данные. Открыто 2 окна очереди печати. В одном окне один принтер, в другом второй. Нужно данные для них раздельно хранить
← →
Юрий Зотов © (2012-07-27 09:57) [8]Сначала Вы говорили о нескольких процессах и DLL, потом об одном процессе (притом чужом) и окнах... уж определитесь как-то.
В чем исходная задача?
← →
Медвежонок Пятачок © (2012-07-27 09:58) [9]окно1_капшен=капшен1
окно2_капшен=капшен2
← →
Медвежонок Пятачок © (2012-07-27 09:59) [10]разные окна различаем?
различаем.
тогда в чем твоя беда?
← →
EgorovAlex © (2012-07-27 10:07) [11]Исходная задача: есть процесс проводник, подгружаю к нему свою dll, для окна очереди печати принтера добавляю свои пункты меню, расширяю функционал. Все задачи решены, кроме вот этой возникшей.
Имя принтера получаю в хуке WH_CBT, обрабатывая HCBT_CREATEWND, там передаётся заголовок окна (который в этот момент содержит имя принтера).
Меню своё в главное меню окна добавляю в хуке WH_CBT, обрабатывая HCBT_ACTIVATE, т.к. в этот момент уже всё создано и можно безболезненно добавить меню (с проверкой, чтобы добавление было только один раз).
Нажатия на пункты меню получаю в хуке HCBT_ACTIVATE, обрабатывая HCBT_ACTIVATE.
Пока тестировал на одном окне - преблемы не замечал, как отрыл очередь второго принтера, в первом окне начал получать имя принтера из второго окна.
← →
Медвежонок Пятачок © (2012-07-27 10:09) [12]ну правильно. оно же у тебя лежит в единственной глобальной переменной
← →
EgorovAlex © (2012-07-27 10:09) [13]Как получить из dll хендл окна? Сейчас я его получаю и сохраняю в HCBT_ACTIVATE хука WH_CBT, и это не работает для нескольких окон
← →
EgorovAlex © (2012-07-27 10:11) [14]Текст:
Нажатия на пункты меню получаю в хуке HCBT_ACTIVATE, обрабатывая HCBT_ACTIVATE.
Читать как:
Нажатия на пункты меню получаю в хуке WH_GETMESSAGE, обрабатывая WM_COMMAND.
← →
Anatoly Podgoretsky © (2012-07-27 10:28) [15]> EgorovAlex (27.07.2012 09:56:07) [7]
Раздельное хранения реализуется отдельными переменным, или массиво подобными
объектами
← →
EgorovAlex © (2012-07-27 10:34) [16]Спасибо, к этому и склонялся, но как мне сейчас в dll определяться, в каком окне я нахожусь? Сначала думал по Id процесса, он оказался одинаковый, как мне из длл получить хендл окна, только по нему, похоже, можно определять своё нахождение
← →
EgorovAlex © (2012-07-27 10:38) [17]По идее можно попробовать GetForegroundWindow, т.к. раз уж юзер тыкает по меню, то это окно активно, но могут быть подводные камни?
← →
Плохиш © (2012-07-27 11:20) [18]
> Хранение данных в dll, используемой несколькими процессами
>
> EgorovAlex © (27.07.12 09:20)
>
> Где хранить уникальные для каждого процесса данные?
> EgorovAlex © (27.07.12 09:41) [4]
>
> А не, я похоже не так выразился, процесс один у меня - explorer.
> exe, а окна разные
>
Так подумать надо перед выразиться.
PS. Кстати, даже начинающий программист сможет добавить классу окна требуемое свойство.
← →
EgorovAlex © (2012-07-27 11:36) [19]Спасибо, Плохиш, сказал - как отрезал. Я в ветке начинающих и разместил вопрос. Как добавить это свойство?
← →
brother © (2012-07-27 11:57) [20]я тебе все сказал...
← →
Плохиш © (2012-07-27 12:12) [21]
> EgorovAlex © (27.07.12 11:36) [19]
>
> Спасибо, Плохиш, сказал - как отрезал. Я в ветке начинающих
> и разместил вопрос. Как добавить это свойство?
Для того чтобы считаться начинающим, надо иметь базовые знания.
← →
Anatoly Podgoretsky © (2012-07-27 12:20) [22]> Плохиш (27.07.2012 12:12:21) [21]
То есть быть программистом!
← →
EgorovAlex © (2012-07-27 15:00) [23]Все мы новички в определённой области.
Накопал Thread Local Storage - верное направление?
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686749(v=vs.85).aspx
← →
Плохиш © (2012-07-27 15:11) [24]Процессы, потом окна, теперь трэды.
Ты бы разобрался сначала, что хочешь-то.
← →
Anatoly Podgoretsky © (2012-07-27 15:16) [25]> Плохиш (27.07.2012 15:11:24) [24]
Хочется все и сразу
← →
EgorovAlex © (2012-07-27 15:20) [26]Что мне нужно, я уже описал: на этапе создания окна сохранять его специфические свойства и потом их суметь прочитать. Изучение проблемы показало, что из dll узнать имя окна (или дескриптор), её использующего - задача нетривиальная. Вот и ковыряюсь, как могу. Чем тыкать на недочёты первоначальной постановки задачи лучше указать направление движения дальше. Никогда на уровне апи не разбирался с окнами, нужды не было.
Подобного применения внедрённой длл не встречас, в любой другой процесс встраиваться очень легко, т.к. это всегда отдельный процесс, а не как у проводника - один процесс с кучей окон.
← →
Плохиш © (2012-07-27 15:22) [27]
> Что мне нужно, я уже описал: на этапе создания окна сохранять
> его специфические свойства и потом их суметь прочитать.
> Изучение проблемы показало, что из dll узнать имя окна (или
> дескриптор), её использующего - задача нетривиальная. Вот
> и ковыряюсь, как могу. Чем тыкать на недочёты первоначальной
> постановки задачи лучше указать направление движения дальше.
> Никогда на уровне апи не разбирался с окнами, нужды не
> было.
>
Гланды удалять можно не только через рот.
← →
EgorovAlex © (2012-07-27 15:37) [28]
> Гланды удалять можно не только через рот.
У нас сейчас разговор такой, раз уж на аналогии перешли:
А-Хочу удалить гланды через ж...
-Не это не правильно!
А-Ну тогда попробую через п...
-Тоже фигня
А-Буду удалять через рот, как?
-Ты уж определись, что тебе нужно, а то сразу всё хочешь...
← →
EgorovAlex © (2012-07-27 15:44) [29]Как показало исследование: из длл для разных окон (разные очереди принтеров) возвращаются одинаковые значения GetCurrentProcessId и GetCurrentThreadId. Как их ещё можно идентифицировать?
← →
EgorovAlex © (2012-07-27 15:53) [30]Если бы это были хотя бы разные потоки, можно было бы обойтись threadvar, поэтому и спросил про Thread Local Storage...
← →
Cobalt © (2012-07-28 01:05) [31]Тебе длл для чего - хук ставишь?
Как твой код вызывается из проводника? Отсюда и надо плясать.
← →
EgorovAlex © (2012-07-30 10:42) [32]В общем я решил эту задачу следующим образом - я же во всех перехваченных событиях в хуках получаю хендл окна, и искать его не надо, просто создаю массич из пар - (хендл:имя принтера), и при возникновении собития в хуке, беру имя принтера из массива по полученному хендлу.
Всем помогающим спасибо
← →
Добряк (2012-07-30 13:50) [33]На сайте "Домашнее коневодство" тебе бы больше помогли
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.075 c