Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как стереть самого себя?

9.7K
22 ноября 2005 года
Dimonchik
14 / / 14.07.2005
Привет всем!

В статье Win32 API FAQ "Как стереть самого себя?" я нашёл листинг, который впоследствии немного модифицировал (т.к. в нём были ошибки)... Так вот, к чему я веду, всё дело в том, что после создания *.bat файла, действие которого заключается в удалении вызвавшей его программы, он успешно создаётся, но не вызывается функцией CreateProcess(). Может кто подскажет в чём тут дело? Или может быть есть более удобный способ "удаления самого себя" :о)??? Буду очень признателен, если поможете (листинг тестовой программки во вложении).

Заранее благодарен.
406
23 ноября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Dimonchik
Привет всем!

В статье Win32 API FAQ "Как стереть самого себя?" я нашёл листинг, который впоследствии немного модифицировал (т.к. в нём были ошибки)... Так вот, к чему я веду, всё дело в том, что после создания *.bat файла, действие которого заключается в удалении вызвавшей его программы, он успешно создаётся, но не вызывается функцией CreateProcess(). Может кто подскажет в чём тут дело? Или может быть есть более удобный способ "удаления самого себя" :о)??? Буду очень признателен, если поможете (листинг тестовой программки во вложении).

Заранее благодарен.



Измени вызов CreateProcess на такой:

CreateProcess(
NULL,
(LPSTR) batfile,
NULL,
NULL,
FALSE,
IDLE_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MODE,
NULL,
NULL,
&si,
&pi);

398
24 ноября 2005 года
Alexandoros
630 / / 21.10.2005
Мне лень проверять, но кажется для запуска батника нужна ShellExecute.
9.7K
24 ноября 2005 года
Dimonchik
14 / / 14.07.2005
Ура, получилось!!!
Большое спасибо за советы, но всё-таки функция CreateProcess() не помощник в этом деле. Помог второй вариант, т.е. ShellExecute().

Выкладываю рабочий вариант этой проги...
406
25 ноября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Dimonchik
Ура, получилось!!!
Большое спасибо за советы, но всё-таки функция CreateProcess() не помощник в этом деле. Помог второй вариант, т.е. ShellExecute().

Выкладываю рабочий вариант этой проги...


Ндаа... у меня все отлично работает и с
CreateProcess()

1.2K
25 ноября 2005 года
BigBug
93 / / 30.07.2004
Тема уже както поднималась :
http://forum.codenet.ru/showthread.php?s=&threadid=17461&highlight=%F1%F2%E5%F0%E5%F2%FC+%F1%E5%E1%FF
Советую взглянуть автору данной.

В теме также пишется что есть место в реестре
куда можно записать файл для удаления после перезагрузки.
Вот только жаль не написано где именно.
Может ктото знает ?
9.7K
25 ноября 2005 года
Dimonchik
14 / / 14.07.2005
Цитата:
Originally posted by vitaly2003s
Ндаа... у меня все отлично работает и с
CreateProcess()



Незнаю как у тебя, а у меня на Visual Studio 2005 Beta 2 не работает, может в релизе уже заработало...

9.7K
25 ноября 2005 года
Dimonchik
14 / / 14.07.2005
Цитата:
Originally posted by BigBug
Тема уже както поднималась :
http://forum.codenet.ru/showthread.php?s=&threadid=17461&highlight=%F1%F2%E5%F0%E5%F2%FC+%F1%E5%E1%FF
Советую взглянуть автору данной.

В теме также пишется что есть место в реестре
куда можно записать файл для удаления после перезагрузки.
Вот только жаль не написано где именно.
Может ктото знает ?



Честно говоря не знаю я такого места в реестре... но всё-таки более удобнее когда программа уничтожает себя сразу, без перезагрузки компьютера, особенно если это какой-то зловред :о))))))

406
25 ноября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Dimonchik
Незнаю как у тебя, а у меня на Visual Studio 2005 Beta 2 не работает, может в релизе уже заработало...



Ну конечно обвини еще во всем Visual Studio

398
02 декабря 2005 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by vitaly2003s
Ну конечно обвини еще во всем Visual Studio



Хммм..., у меня тоже не работает.

Код:
#include <Windows.h>

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 off
echo HI, IM PROGA
pause


Давай-ка код с CreateProcess, запускающий батник, в студию!
398
02 декабря 2005 года
Alexandoros
630 / / 21.10.2005
-2 пост
406
02 декабря 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Alexandoros
-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

398
02 декабря 2005 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by vitaly2003s
Блин люди,вы ваще что нить читаете или пробуете прежде чем сюда писать. Тебя никто не учил прежде чем использовать структуру ее нужно обнулить и в некоторых случаях проинициализировать.
Попробуй так,у меня как всегда все ок.



Угу, работает :)

ПС
Задача:
Мальвина дала Буратино 3 яблока. Потом забрала назад 1.
Впорос: Сколько яблок осталось у Буратино?
Ответ: ХЗ. Никто не знает сколько у него яблок было до того.
Мораль: ВСЕГДА инициализируйте переменные.
:D

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог