#1 24-08-2013 16:00

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Связь двух процессов|Запись звука

Привет всем. Два довольно нетематических для форума вопроса...

1. Есть процесс, есть другой процесс, есть dll библиотека, которая инжектится во второй процесс. Эта библиотека выполняет какой-либо функционал и должна как-то доложить первому процессу о чем-либо. Попробовал так: объявить какие-либо поля с данными, которые надо передать в первый процесс, как поля dllexport, чтобы потом из первого процесса, просканировав второй процесс и найдя dll, делать ReadMemoryEx. ИМХО, немного неправильно экспортировать из dll не функции, а данные.
Что делает эта dll: хукает 1-6 winapi функций, такие как CreateWindow и тд. Я думал на тему других методов, но ничего дельного не придумал. Предлагайте варианты, если есть идеи.

2. Как в Windows (хотя бы в семерке или восьмерке где другая звуковая система, по сравнению с XP) можно писать звук определенного процесса? Я делаю довольно кривым методом, но рабочим: создается виртуальное устройство с помощью Virtual Audio Cable, в настройках подопытной программы ставлю использование этого устройства (и микрофон и динамик), пишу с этого устройства в моей проге с помощью библиотеки bass и потом свожу звук с микрофона и динамика с помощью микшера (опять-таки из bass). Примерно как-то так.

У меня были идеи хукать интерфейс IAudioRenderClient отдельного процесса (точнее я где-то читал, что кто-то, хукнув его и далее, использовав его GetBuffer метод, мог писать звук отдельного процесса), но у меня нет идей и знаний по хуку интерфейсов.

Есть еще идея писать небольшой драйвер устройства, который будет представлять собой устройство, в которое будет пропускать через себя звук подопытной программы (принцип тот же, что у Virtual Audio Cable, только без использования сторонних программ). Либо написать драйвер-фильтр, который будет как-то писать звук нужной программы.

Опыт написания драйверов ограничивается переделкой example'ов от майкрософта, поэтому я не шарю в этом всем, если есть опытные люди, прошу помочь.

Last edited by Jack Daniel's (24-08-2013 16:58)

Offline

#2 24-08-2013 22:58

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Связь двух процессов|Запись звука

По забавному совпадению я сегодня читал один интересный блог, посвященный программированию на языке Delphi (понял для себя, что не все так плохо на самом деле, особенно с выходом последних версий Delphi XE1-4). Начал чтение как раз с цикла статей, посвященных созданию системы плагинов
http://www.gunsmoker.ru/2013/04/plugins-9.html

Но суть поста в другом. В этом блоге была одна интересная заметка
Сага о X, Y и Z...
Рекомендую прочитать) Вот, чтобы не получилось, как в той заметке, что мы будем обсуждать Y вместо Z, задам уточняющий вопрос по первому пункту

Один из процессов чужой? Т.е. мы не имеем его исходников? Если все-таки оба процесса "наши" и надо построить систему обмена данными между ними, возможно есть смысл посмотреть цикл статей по первой ссылке.

Offline

#3 25-08-2013 13:49

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Связь двух процессов|Запись звука

Большое спасибо за ссылки, сегодня прочту. прочитал пару статеек, очень много хороших советов и хитростей (например, про DllMain).

Да, второй процесс чужой, сорцов нет. Второй процесс - процесс Skype. Пишу небольшой рекордер звонков для него. Dll детектит начало звонка, первый процесс, получая данные о том, что звонок начался, начинает писать звук, получает окончание звонка - прекращает писать и сохраняет все это дело.

По-началу я использовал Skype API - библиотеку Skype4COM.dll, которая подключается к проекту и далее можно легко взаимодействовать со скайпом, только этот API прекратит работать в 2014 году.

P.S Нет, это не будет вирус-ворующий-звонки) Начал писать из-за объявления на фрилансе, но заказчику утилита оказалсь уже не нужна, но ради интереса продолжил пилить.

Last edited by Jack Daniel's (25-08-2013 17:58)

Offline

#4 25-08-2013 17:58

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Связь двух процессов|Запись звука

Первый вопрос, похоже, решился. Кому интересно:
MSDN
WIKI

Я попробовал Mail Slot, но для отправки пары флажков и потом, возможно, строк, как-то многовато действий + не очень удобно. Потом попробовал Shared Memory (это когда процессы используют выделенную одним из них общую память), этот способ больше понравился. А Windows Sockets, как и Mail Slot, слишком громоздкое решение.

Last edited by Jack Daniel's (25-08-2013 18:00)

Offline

Board footer

Powered by FluxBB