Aspire и? ExitProcess состоит из Код (Text): ZwTerminateProcess( 0, ExitCode ); LdrShutdownProcess(); CsrClientCallServer( apimsg /* пустой буфер */, 0, 0x10003, 4 ); ZwTerminateProcess( -1, ExitCode ); После второго вызова ZwTerminateProcess больше ничего не исполняется - процесс убит. Так что насчет адреса возврата я немного недопонял..
Господа, извините, что опять поднимаю эту тему, но все оказалось не так просто как выглядтело вначале... Итак, задача такая -- я создаю файл, с которым надо выполнить действия, ассоциированные с ним в системе по умолчанию. Т.е. если это jpg файл, то вызвать для него просмотрщик, установленный в системе... А после этого нужно уничтожить тот файл, из которого была запущена моя программа. Вначале все было просто, создаю батник, который уничтожает мою программу. И выполняю его с помощью команды ShellExecute. Файл уничтожается нормально. Но вот когда я добавил функцию показа созданного файла (я его тоже показываю с помощью второй функции ShellExecute), то мой файлик перестал уничтожаться! Убираем функцию показа файла -- он опять уничтожается нормально. Более того, я заметил, что если я трассирую свою программу с помощью отладчика, то даже в том случае, когда у меня нет функции показа файла, то мой батник не может уничтожить мою программу! Создается такое впечатление, что он пытается уничтожить файл, но он еще занят процессом. А когда процесс завершается, то он успевает это сделать. А под отладчиком -- нет... Господа! У меня уже крыша едет!
Хорошо, я уже начинаю подозревать что создание второго процесса не такое уж и сложное занятие, чтобы потереть исходный файл. В связи с этим два вопроса -- С какими параметрами надо использовать OpenProcess? что-то я недопонял. Может имелось ввиду CreateProcess? Вопрос второй. Должен ли созданный процесс дожидаться завершения первого процесса, чтобы потереть его файл? Моя цель -- создать код, который все остальные смогли бы использовать в своих программах, не утруждаясь особо на подобные изыски...
pris0ner А можно глянуть на Ваш bat-файл? Может разумно было бы создавать его с таким содержимым: Код (Text): @ECHO OFF :tryagain DEL MY.EXE IF EXIST MY.EXE GOTO tryagain DEL 1.BAT ? И тогда удалена Ваша программа будет по своему завершению: не зависимо от того, будет ли она завершена сразу или спустя какое-то время.
Все способы палевные! Почему просто не сделать MoveFileEx в папку темп и пометить на удаление, после ребута система его удалит.
батник выглядит так: chcp 1251 del "C:\radasm\Masm\Projects\regstop\regstop\ssd.scr_" del "C:\WINDOWS\q2kert90.bat" насчет пометки для удаления и перемещения файла, то я так полагаю, что если человек получил какой-то файл и у него появились какие-то подозрения, то любой перемещенный файл можно найти. Хотя моя прога все же первым делом себя перемещает. Поэтому я и полагаю что нужно именно удалять себя как можно быстрее. Почему и спрашиваю насчет способа с отдельным потоком... p.s нельзя ли переименовать тему? чтобы было понятно об удалении какого файла идет речь? а то не все сразу врубаются...
pris0ner Ну вот и замените батник на мой вариант из 27-го поста, и никаких проблем не будет (разумеется подкорректировать имена файлов нужно, и chcp 1251, соответственно, тоже туда вставить надо). Создание нового процесса - не менее "палевно", чем запуск bat-файла, т.к. собственно одно и то же. Единственная разница: имя процесса можно самому выбрать... типа csrss.exe, а для bat-файла это всегда cmd.exe. Но если Ваша программа сразу выгружается после запуска bat, то и cmd.exe вряд ли пропалится, т.к. жить доли секунды будет. maestro-ant ИМХО еще более "палевно", т.к. до перезагрузки файл будет преспокойно лежать на винте, когда процесс уже будет выгружен.
огромное спасибо l_inc! заменил батник по вашему образцу и все заработало. как я сумел разобраться, батник запускается параллельно моему процессу. Пока процесс не закончен, он не может потереть его файл. В первом варианте моей программы процесс успевал завершиться до того, как батник начинал работу. поэтому все работало нормально. Теперь же после внесенных изменений тоже стало все нормально. В принципе вещь неочевидная, если привык к линейному исполнению программ... Спасибо что помогли разобраться...
По поводу chcp - не факт что в системе используется именно кодировка utf8, потому желательно воспользоваться GetACP() + wsprintf().