Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.06 c
10-1178529831
Alek_1
2007-05-07 13:23
2013.03.22
ActiveX и браузер


2-1333737680
SiDimka
2012-04-06 22:41
2013.03.22
Вызов прцедуры из bpl


15-1352775498
Abcdef123
2012-11-13 06:58
2013.03.22
Современные тенденции пользовательского интерфейса


15-1337159093
Дмитрий С
2012-05-16 13:04
2013.03.22
Загрузить одним махом несколько динамических массивов.


15-1339518297
Artem
2012-06-12 20:24
2013.03.22
Что лучше Android или Windows Mobile?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский