Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как связать между собой 2-вe уже запущеные одним процессом DLL  (Прочитано 12699 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kotiara
Постоялец

ua
Offline Offline

« : 02-09-2009 23:10 » 

Всем доброго времени суток.
Возникла такая проблема: есть стороннее приложение (ни исходников, ни понятия, как устроено, естественно, нет) у него есть два интерфейса для подключения длл. Первый - для выполнения разной работы для приложения, типа служебный что-то там делает, библиотека возвращает или нет результаты. Приложение на это как-то реагирует (производит или не производит определённые действия). Второй интерфейс: подключенная библиотека получает данные что-то с ними делает и возвращает результат. На работу программы результат не влияет, но через программу можно вывести результат на экран в удобоваримой форме (графики и тому подобное).
Проблема заключается в следующем: я уже написал одну длл, которая выполняет некоторую работу, но она требует определённой доводки. Вывести результаты её работы через программу не получится, я подумал, что можно было бы написать ещё одну простенькую длл-ку, которая будет подключаться ко второму интерфейсу и  как бы мониторить первую, выводя результаты через само приложение. Но как связать их между собой, понять не могу. Обе длл-ки должны быть загружены одним и тем же приложением и уже потом связаны между собой, я думаю, теоретически это возможно, но как это реализовать на практике, не представляю. Подскажите, пожалуйста, если кто знает, как это можно сделать Не понял
 
« Последнее редактирование: 06-09-2009 16:02 от Sel » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 02-09-2009 23:20 » 

Если такое не предусмотрено головной программой. То нужно организовывать механизм самому. Могу предложить расшаривание памяти через механизм маппирования файлов в память и одноименные мьютексы.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #2 : 02-09-2009 23:34 » 

А не подскажете где можно подробно ознакомится с этими делами или хотябы слова для поска на английском(Я плохо пишу по Английски правда как впочем и по русски у меня к сожалению напроч отсутствуют способности к гуманитарным наукам Улыбаюсь  ) ?
Записан
zubr
Гость
« Ответ #3 : 03-09-2009 06:26 » 

Finch, не совсем понимаю, что в данном случае даст файлмаппинг?
Kotiara, как вариант, попробовать подменить имеющуюся длл своей. Насколько я понимаю, раз интерфейс функций известен, то:
1. Создаешь свою длл под тем же именем, которую надо подменить.
2. Подменяемую длл переименовываешь.
3. Создаешь в своей длл набор функций соответствующих интерфейсному набору, а возможно и придется весь набор экспортируемых функций создавать.
4. В созданных функциях вызываешь одноименные функции из подменяемой длл, а затем если необходимо добавляешь свой код.
Записан
zubr
Гость
« Ответ #4 : 03-09-2009 06:35 » 

Можно еще с помощью внедрения в память процесса чужой длл (Finch ты это имел в виду под маппингом?), но это имхо гораздо сложнее, особенно для новичка, хотя может и кода придется писать меньше. Чтобы подобное реализовать полезно почитать книжку "Внутреннее устройство Windows ..." Руссиновича, а также посмотреть здесь: www.wasm.ru
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 03-09-2009 12:36 » 

zubr, DLL находятся в одном адресном пространстве. Так что внедряться в чужой процесс не нужно. Я вот сегодня подумал, что насчет мьютексов я глупость сказал. Если все это будет крутится в одном потоке. Мьютексы не нужны совсем. А Файлмапинг это проецирование файла в память. Причем несколько процессов могут проецировать один и тот же файл. Получается что область проецирования расшаривается на несколько процессов. А в данном случае на несколько Dll. Тем более две его, им писанные. И не нужно гадать, где именно одна DLL выделела память.
Второй способ, это сделать служебные функции головной DLL. При иницилизации второй DLL просто подгружать первую. Если она уже была загруженна в область памяти процесса, то Windows отдаст дескриптор ранее загруженного экземпляра. Останется только подключится к этим служебным функциям. И запрашивать состояние головной Dll. Думаю, что он более правильный.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Гость
« Ответ #6 : 03-09-2009 14:14 » 

Finch, исходя из задачи, насколько я понял, у человека программа и одна длл чужие (без исходников). Опять насколько я понимаю, ему надо перехватывать функции имеющейся чужой длл и добавлять, или изменять их своим кодом. Объясни подробнее как можно с помощью отражения файла в память перехватить и модернизировать функцию.
Цитата
Второй способ, это сделать служебные функции головной DLL. При иницилизации второй DLL просто подгружать первую. Если она уже была загруженна в область памяти процесса, то Windows отдаст дескриптор ранее загруженного экземпляра. Останется только подключится к этим служебным функциям. И запрашивать состояние головной Dll. Думаю, что он более правильный.
Согласен, к функциям он подключится таким образом, а если их надо модифицировать или вообще запретить, беда в том, что они все равно выполнятся в в вызывающим их exe-приложении.
З.Ы. Внедрение в адресное пространство чужого процесса все равно происходит в контексте адресного пространства процесса который подвергается внедрению. Для этого ставится глобальный хук.
Записан
Kotiara
Постоялец

ua
Offline Offline

« Ответ #7 : 03-09-2009 19:15 » 

zubr спасибо за инфу обязательно почитаю. Обе длл-ки мои влиять на работу ни одной ни другоя не надо, мне нужно чтобы обе длл-ки были запущены одним приложением а потом установить между ними связь чтобы считывать данные из одной в другую. Интерфейсы для общения я могу дописать в обоих длл файлах, главная проблема была в том что я незнал как их связать после загрузки. 
Записан
Kotiara
Постоялец

ua
Offline Offline

« Ответ #8 : 03-09-2009 19:23 » 

Цитата
При иницилизации второй DLL просто подгружать первую. Если она уже была загруженна в область памяти процесса, то Windows отдаст дескриптор ранее загруженного экземпляра.
Тоесть при попытке подгрузить уже загруженную процессом длл возвращается дескриптор загруженной?
Тогда всё совсем просто. Народ вы простите что я глупые вопросы задаю просто подробное описание подобных вопросов найти очень тяжело, в литературе этой темы если и касаются то вскользь А черт его знает...
Записан
zubr
Гость
« Ответ #9 : 03-09-2009 20:28 » 

В DllMain при dwReason == DLL_PROCESS_ATTACH загружаешь свою длл функцией LoadLibrary. Адрес функций получаешь функцией GetProcAddress.
Записан
Kotiara
Постоялец

ua
Offline Offline

« Ответ #10 : 04-09-2009 20:28 » 

У меня созрел ещо один вопрос не может ли так быть что каждый поток приложения получает личную копию длл-ки?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 04-09-2009 20:39 » 

Kotiara, Dll проецируется в память процесса всего один раз. Сколько бы ты потоков в процессе не открывал, ты будеш иметь дело всего с одним экземпляром Dll.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines