Есть такая ситуация: Некий программный продукт предлагает рисовать графику, обладает многооконным интерфейсом и позволяет копировать графические объекты только между окнами своей программы(загруженного в данный момент проекта).
Стоит следующая задача : запустить 2 копии программы 1-ая копия загужает проект с графикой, 2-ая копия — чистый проект, скопировать графмчексуие объекты в чистые проект.
Варианты решения:
В статье Jeffrey Richter (Microsoft System Jornal\september\Win32 Q & A) (MSDN 6.0) предлагается вариант чтения данных из адресного пространства "чужого" процесса в свой
шагая по "чужой" памяти структурой LV_ITEM (задача в статье так поставлена). В моём вопросе Всё сложнее — Надо неизвестно что, неизвестно как прочитать и так-же положить в другой процесс. Исследования показали, что продукт етот не использует ClipBoard. Собственно вопрос — Можно ли как нибудь указать для одного из процессов в качестве рабочей области памяти — область другого процесса (другой копии его самого).Если можно, то как это правильно сделать. (Буду благодарен за любые идеи).
Здравствуйте, Balagur, Вы писали:
> В моём вопросе Всё сложнее — Надо неизвестно что, неизвестно как прочитать и так-же положить в другой процесс.
Как — более или менее ясно. Открываешь процесс с помощью OpenProcess и читаешь из него память с помощью ReadProcessMemory.
Но если неизвестно что читать — то ответ может быть только "пойди туда не знаю куда, найди то, не знаю что".
Можно просканировать память чужого процесса и поискать там commited области. Можно их тип определить, чтобы отсечь те, что относятся к image. (см. того же Рихтера) Но остаются стеки, кучи, статическая память... Где искать-то ?
1.WRITEONCOPY или пробежаться VirtualQuery и далее ReadProcessMemory.
2. стек тоже можно копировать его можно взять из TIB или подменить стек
и копировать уже зная откуда.
остаётся проблема открытых хендлов. Но и их можно скопировать
DuplicateHandle, только нужно знать заранее какой максимальный, а можно просто с запасом взять.
если объектов нет то они и не скопируются!
И проблема Heap. тут или самому свой Heap писать, или давать гарантию,
что на момент запуска другой копии программы его не будет, или ещё что.
Перед всеми операциями клонируемый процесс перевести в режим Suspend.
Здравствуйте, Pavel Dvorkin, Вы писали:
>> В моём вопросе Всё сложнее — Надо неизвестно что, неизвестно как прочитать и так-же положить в другой процесс.
PD>Как — более или менее ясно. Открываешь процесс с помощью OpenProcess и читаешь из него память с помощью ReadProcessMemory.
А почему не Memory mapped files? Это надежней и проще.
PD>Но если неизвестно что читать — то ответ может быть только "пойди туда не знаю куда, найди то, не знаю что".
Как вариант: зарегистрировать свой формат и передавать через клипбоард
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Всем спаибо!!!
Вопрос остался открытым!!!!!!!!!!
Что я уже сделал:
1 OpenProcess
2 DuplicateHandle,
3 VirtualQuery
4 ReadProcessMemory.
5 WriteProcessMemory.
Копировать стек считаю не целесообразным — всё равно что разбираться "Soft Ice" -ом какие там собственные классы, структуры, Union — ы, и #tydef использовали разработчики софта.
Поясняю задачу ещё раз:
1 Загружаю программку A — копия1 (писал её не я , исходников — нет) пишу в ней текст, рисую графику, вставляю спец объекты, вставляю ActiveX.
2 Загружаю программку A — копия2 . Создаю в ней новый пустой проект и ничего не создаю.
3 Загружаю программку B (- в том что она делает и есть вопрос (объединяет адресное пространство A — копия1 и A — копия2)).
4 Так как A — копия2 опирается на ту-же память, что и A — копия1 имею право сохранить проект в программе A — копия2 на диск. И таким макаром скопировать всю графику из A — копия1 в A — копия2
Здравствуйте, Balagur, Вы писали:
B>Копировать стек считаю не целесообразным — всё равно что разбираться "Soft Ice" -ом какие там собственные классы, структуры, Union — ы, и #tydef использовали разработчики софта.
Тем не менее, если ты действительно хочешь сделать то, что хочешь, то другого выхода, кроме как дизассемблировать программу, разобраться в ее логике и структурах данных и где хранятся указатели на эти структуры — у тебя нет. Как говорится, Бог в помощь, но часто может быть проще написать программу самому с нуля.
B>Поясняю задачу ещё раз: B>1 Загружаю программку A — копия1 (писал её не я , исходников — нет) пишу в ней текст, рисую графику, вставляю спец объекты, вставляю ActiveX. B>2 Загружаю программку A — копия2 . Создаю в ней новый пустой проект и ничего не создаю. B>3 Загружаю программку B (- в том что она делает и есть вопрос (объединяет адресное пространство A — копия1 и A — копия2)). B>4 Так как A — копия2 опирается на ту-же память, что и A — копия1 имею право сохранить проект в программе A — копия2 на диск. И таким макаром скопировать всю графику из A — копия1 в A — копия2
Причем тут "опирается на ту же память"? Ну хорошо, сможешь ты физически установить указатель в одной программе на область памяти второй, ну и что дальше? Объект реально находится во многих ссылающихся друг на друга (часто неявно) динамических структурах с указателями на них в статических и стековых переменных.