Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Хранение данных в 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.089 c
15-1342284725
ПЛОВ
2012-07-14 20:52
2013.03.22
Некорректная работа StringReplace, или я туплю?


1-1260020917
defen
2009-12-05 16:48
2013.03.22
асинхронное шифрование rsa


2-1340113435
Новичок
2012-06-19 17:43
2013.03.22
Программа на Lazarus для MacOS


15-1352990265
0xDEADBEEF
2012-11-15 18:37
2013.03.22
троеточие в элементах интерфейса


15-1339078612
Artem
2012-06-07 18:16
2013.03.22
Посоветуйте электронные шахматы...