Как стереть самого себя?
В статье Win32 API FAQ "Как стереть самого себя?" я нашёл листинг, который впоследствии немного модифицировал (т.к. в нём были ошибки)... Так вот, к чему я веду, всё дело в том, что после создания *.bat файла, действие которого заключается в удалении вызвавшей его программы, он успешно создаётся, но не вызывается функцией CreateProcess(). Может кто подскажет в чём тут дело? Или может быть есть более удобный способ "удаления самого себя" :о)??? Буду очень признателен, если поможете (листинг тестовой программки во вложении).
Заранее благодарен.
Привет всем!
В статье Win32 API FAQ "Как стереть самого себя?" я нашёл листинг, который впоследствии немного модифицировал (т.к. в нём были ошибки)... Так вот, к чему я веду, всё дело в том, что после создания *.bat файла, действие которого заключается в удалении вызвавшей его программы, он успешно создаётся, но не вызывается функцией CreateProcess(). Может кто подскажет в чём тут дело? Или может быть есть более удобный способ "удаления самого себя" :о)??? Буду очень признателен, если поможете (листинг тестовой программки во вложении).
Заранее благодарен.
Измени вызов CreateProcess на такой:
CreateProcess(
NULL,
(LPSTR) batfile,
NULL,
NULL,
FALSE,
IDLE_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MODE,
NULL,
NULL,
&si,
&pi);
Большое спасибо за советы, но всё-таки функция CreateProcess() не помощник в этом деле. Помог второй вариант, т.е. ShellExecute().
Выкладываю рабочий вариант этой проги...
Ура, получилось!!!
Большое спасибо за советы, но всё-таки функция CreateProcess() не помощник в этом деле. Помог второй вариант, т.е. ShellExecute().
Выкладываю рабочий вариант этой проги...
Ндаа... у меня все отлично работает и с
CreateProcess()
http://forum.codenet.ru/showthread.php?s=&threadid=17461&highlight=%F1%F2%E5%F0%E5%F2%FC+%F1%E5%E1%FF
Советую взглянуть автору данной.
В теме также пишется что есть место в реестре
куда можно записать файл для удаления после перезагрузки.
Вот только жаль не написано где именно.
Может ктото знает ?
Ндаа... у меня все отлично работает и с
CreateProcess()
Незнаю как у тебя, а у меня на Visual Studio 2005 Beta 2 не работает, может в релизе уже заработало...
Тема уже както поднималась :
http://forum.codenet.ru/showthread.php?s=&threadid=17461&highlight=%F1%F2%E5%F0%E5%F2%FC+%F1%E5%E1%FF
Советую взглянуть автору данной.
В теме также пишется что есть место в реестре
куда можно записать файл для удаления после перезагрузки.
Вот только жаль не написано где именно.
Может ктото знает ?
Честно говоря не знаю я такого места в реестре... но всё-таки более удобнее когда программа уничтожает себя сразу, без перезагрузки компьютера, особенно если это какой-то зловред :о))))))
Незнаю как у тебя, а у меня на Visual Studio 2005 Beta 2 не работает, может в релизе уже заработало...
Ну конечно обвини еще во всем Visual Studio
Ну конечно обвини еще во всем Visual Studio
Хммм..., у меня тоже не работает.
int WINAPI WinMain(HINSTANCE hInt, HINSTANCE hPrev, LPSTR CmdLn, int CmdSh)
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInformation;
char batfile[] = "hi.bat";
// ShellExecute(NULL,"open", batfile, NULL, ".", SW_SHOW ); // работает
int err = CreateProcess(NULL,(LPSTR) batfile, NULL,
NULL, FALSE, IDLE_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MODE,
NULL, NULL, &StartupInfo, &ProcessInformation); // нихрена не пашет
err = GetLastError(); // код ошибки 998 - Invalid access to memory location.
return 0;
}
Батфайл hi.bat:
echo HI, IM PROGA
pause
Давай-ка код с CreateProcess, запускающий батник, в студию!
-2 пост
Блин люди,вы ваще что нить читаете или пробуете прежде чем сюда писать. Тебя никто не учил прежде чем использовать структуру ее нужно обнулить и в некоторых случаях проинициализировать.
Попробуй так,у меня как всегда все ок.
STARTUPINFO StartupInfo={0};
PROCESS_INFORMATION ProcessInformation={0};
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.wShowWindow = SW_SHOW;
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
char batfile[] = "hi.bat";
SetLastError(0);
int err = CreateProcess(NULL,(LPSTR) batfile, NULL,
NULL, FALSE, IDLE_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MODE,
NULL, NULL,&StartupInfo, &ProcessInformation); //возвращяет 1
//появляется батник
err = GetLastError(); //возвращяет 126
Блин люди,вы ваще что нить читаете или пробуете прежде чем сюда писать. Тебя никто не учил прежде чем использовать структуру ее нужно обнулить и в некоторых случаях проинициализировать.
Попробуй так,у меня как всегда все ок.
Угу, работает :)
ПС
Задача:
Мальвина дала Буратино 3 яблока. Потом забрала назад 1.
Впорос: Сколько яблок осталось у Буратино?
Ответ: ХЗ. Никто не знает сколько у него яблок было до того.
Мораль: ВСЕГДА инициализируйте переменные.
:D