2013-09-05 3 views
1

У меня есть массив, который мне нужно разделить между двумя процессами. Первый процесс имеет инъецированную DLL, которая постоянно захватывает информацию о нескольких объектах, а второй процесс должен получать эту информацию. Я постоянно обновляю этот массив (данные в объекте сильно меняются), а другой процесс должен постоянно получать эти обновления. Я видел примеры, когда люди используют общую память, но я не уверен, как использовать ее для постоянного обновления массива. Любой совет или код, который вы можете бросить на меня?Обмен массивом между двумя процессами

ответ

2

Вы можете использовать memory mapped file, чтобы поделиться своим массивом между несколькими процессами.

+0

Я видел это решение, но похоже, что обновление данных в этом файле может быть медленным. Я очень быстро обновляю данные массива. Не будет ли обновление файла постоянно медленным? – haze

+0

Насколько велик ваш массив и как часто вы его обновляете? –

+0

Как правило, файл ввода/вывода кэшируется в MMF для повышения производительности системы. Обновление массива записывается в ОЗУ, а не на диск. –

0

Вы можете обмениваться данными в DLL между процессами, загружающими эту DLL. См. How do I share data in my DLL with an application or with other DLLs? для получения более подробной информации об использовании #pragma data_seg. Поэтому, если вы храните массив в своей DLL, и оба процесса открывают DLL, все, что вам нужно, это некоторая синхронизация (например, мьютекс) для арбитража совместного доступа к данным.

Для удобства вы, вероятно, захотите реализовать экспортированные функции в DLL для чтения/записи данных массива, а не для экспорта самого массива raw.

+0

Из-за природы процесса, в который я впрыскиваю (видеоигра с антихристом), мне пришлось вводить DLL таким образом, чтобы на самом деле это не было DLL. Я использую DLL для своего PE-заголовка, поэтому я могу обрабатывать все перемещение и импортировать зависимости, которые могут существовать. Затем я сопоставляю dll минус PE-заголовок в удаленном процессе, а затем выполняю функцию основного потока (а не dllmain, так как dllmain выполняет только основной поток). – haze

Смежные вопросы