Итак есть две программы.
Программа B создает в программе A поток, в этом потоке должна вызваться MessageBox. Вместо этого получам access violation.
Программу A не привожу: обычное консольное приложение (правда должна пользоваться хоть одной user32 ф-ей).
Код программы B: (смотреть только тем у кого есть свободное время, и нечего делать ;) )
И не только у него. Проверил - соответсвует.
Чую я не правильно ф-ию копирую... но понять не могу... пока.
Я тоже RemoteThread'ами баловался недавно... Всё получалось и пикало в спикер, и показывало боксы, причём под Delphi ;-) Впечатления внутри31.10.02 22:48 Автор: HandleX <Александр М.> Статус: The Elderman
Нитка валяется где-то в программинг.
Кстати, у тебя процесс, в котором создаёшь поток падал\зависал? У меня DrWatson читал отходную процессу в виде логов на диске, дык я по ним определял, что там не то. А ещё можно запустить процесс под каким-нибудь дебуггером, создать поток с флагом CREATE_SUSPENDED, и поставить бряк по адресу, куда поток скопировал. Потом, если возабновить поток, отладить можно и доконать пошагово.
Коллективный разум мне посоветовал делать этот поток как можно меньше, и грузить в нём DLL, в которой чувствуешь себя гораздо вольготнее. Как я понял на собственных муках, закомпилить что-либо и исполнить ЭТО в чужом процессе, всё равно, что собрать кораблик в бутылке ;-)
Ну, и знаешь, я в конце концов сделал что мне надо без удалённого потока. Я хотел, чтобы регедит виндовый открывал мне нужный ключ — прям почти так, как сделано в RegMon Руссиновичем ;-) Там мне нужно было в сообщения, что я кидал в окно TreeView, вставлять указатели на структуры. А они должны быть в процессе, создавшем окно. И я кидал сообщения из своей софтины, структуры копировал в чужой процесс, ну и указатели были соответствующие. Получилось быстрее, без DLL и геморороя ;-)
Удачи!
У кого там мысли одновременно сходятся ? :)01.11.02 01:12 Автор: PS <PS> Статус: Elderman
Увидел, после того как эту создал :)
Кстати там тебе посоветовали размер ф-ий вычитанием адресов определять - не выходит так. Любой размер получается равным 5ти. Почему так - еще не понял.
> Кстати, у тебя процесс, в котором создаёшь поток > падал\зависал?
После того как нажимаешь OK в messageBox'е процесс действительно падает. Но мне это не важно. Если исполнять не месадж боксы, а обычную логику - то все работает и завершается нормально. Это еще тема для иследования, но заниматся ей нет ни времени ни желания.
> У меня DrWatson читал отходную процессу в > виде логов на диске, дык я по ним определял, что там не то. > А ещё можно запустить процесс под каким-нибудь дебуггером, > создать поток с флагом CREATE_SUSPENDED, и поставить бряк > по адресу, куда поток скопировал. Потом, если возабновить > поток, отладить можно и доконать пошагово.
А как ты код видишь ? По идеи дебагер будет показывать только asm. Разве не так ?
> Коллективный разум мне посоветовал делать этот поток как > можно меньше, и грузить в нём DLL, в которой чувствуешь > себя гораздо вольготнее.
Это не интересно, как раз по той причине что легче :) Тем более описанно у Рихтера, а значит вдвойне не интересно ;)
>Как я понял на собственных муках,
> закомпилить что-либо и исполнить ЭТО в чужом процессе, всё > равно, что собрать кораблик в бутылке ;-)
Точно. Зато какое удовольствие :)
> Ну, и знаешь, я в конце концов сделал что мне надо без > удалённого потока. Я хотел, чтобы регедит виндовый открывал > мне нужный ключ — прям почти так, как сделано в RegMon > Руссиновичем ;-) Там мне нужно было в сообщения, что я > кидал в окно TreeView, вставлять указатели на структуры. А > они должны быть в процессе, создавшем окно. И я кидал > сообщения из своей софтины, структуры копировал в чужой > процесс, ну и указатели были соответствующие. Получилось > быстрее, без DLL и геморороя ;-) > Удачи!