Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли сделать, чтобы программа удаляла сама себя?


Страницы:   1 2

Ell ©   (2006-01-19 13:18:00) 

Хочу, чтобы программа (состоит из одного exe’шника), когда истечёт срок её использования, удаляла себя с винта. Только если файл запущен, DeleteFile под Виндовс не проходит...


AndreyAR   (2006-01-19 16:57:00) [21]


> Да и не важно это по большому счёту, какая разница, главное
> результат...


Уважаемым коллегам главное поумничать, и дать понять оппоненту, что он дурак.

Вообще, действительно, делается немного не так. Если автор темы расскажет, зачем ему это, готов покопаться в старых исходниках...


Ell   (2006-01-19 16:53:00) [22]

Leonid Troyanovsky:

> Если говорить точно, то программа удаляется другой программой


Но если говорить ещё более точно, учитывая,  что команду той программе удалить себя дала основная программа, то можно сказать что и она себя удалила :-) (Мы же говорим, например, что такой-то человек построил завод, хотя понимаем, что не он непосредственно кирпичи клал...) И потом, программы же всегда тоже используют внешние процедуры Виндовс.

Да и не важно это по большому счёту, какая разница, главное результат...


Digitman   (2006-01-19 16:48:00) [23]


> Ell   (19.01.06 16:16) [9]


См.
> Leonid Troyanovsky ©   (19.01.06 16:44) [12]


Исп.файл твоей программы удаляется совершенно другой программой.


Leonid Troyanovsky   (2006-01-19 16:44:00) [24]


> Ell   (19.01.06 16:16) [9]

> > Код, фигурирующий в [1], не имеет ни малейшего отношения
> > к теме вопроса.

> Почему же? Программа с тем кодом удаляет сама себя с винта,


Если говорить точно, то программа удаляется другой программой,
т.е. командным процессором, cmd.

--
Regards, LVT.


Ell   (2006-01-19 16:44:00) [25]

AndreyAR, я ещё неточность в процедуре нашёл:
WinToDos надо использовать во всех трёх случаях, чтобы с русскоязычными папками работало.


AndreyAR   (2006-01-19 16:42:00) [26]


> Да, так всё работает, благодарю.


Нема за шо. Хотя я лично так не пишу, пользуюсь готовой функцией из RxLib.


Ell   (2006-01-19 16:16:00) [27]

Digitman:

> Код, фигурирующий в [1], не имеет ни малейшего отношения
> к теме вопроса.

Почему же? Программа с тем кодом удаляет сама себя с винта, только функцию заменил на [7]. Это я и искал.

AndreyAR:
> вот так надо:


Да, так всё работает, благодарю.

Кстати говоря, для завершённости процедуры ещё не помешает снять атрибут "read-only" (на всякий случай, если вдруг такой появился), но с этим я разберусь...


Digitman   (2006-01-19 16:05:00) [28]


> Ell   (19.01.06 15:24) [5]


Код, фигурирующий в [1], не имеет ни малейшего отношения к теме вопроса.


AndreyAR   (2006-01-19 15:54:00) [29]


> function ConvertToDos(S: string): PChar;
> begin
>  CharToOEM(PChar(S), PChar(S));
> end;


вот так надо:

function WinToDos(s: string): string;
var tmp:string;
begin
 SetLength(tmp,length(s));
 CharToOEM(PChar(s),PChar(tmp));
 result:=tmp;
end;


Ell   (2006-01-19 15:25:00) [30]

AbrosimovA

> ConvertToDos(..) для русскоязычной папки


Тогда, может, ошибка в функции? (Я её, честно говоря, не совсем понял.)

function ConvertToDos(S: string): PChar;
begin
 CharToOEM(PChar(S), PChar(S));
end;


Она в бат-файле вместо

del "filename"

создавала строку

l║B
как я уже говорил.


Ell   (2006-01-19 15:24:00) [31]

Digitman:

> Можно.


Спасибо ;-)


Digitman   (2006-01-19 15:06:00) [32]


> Можно ли


Можно.
Но не нужно.


AbrosimovA   (2006-01-19 14:56:00) [33]

ConvertToDos(..)для русскоязычной папки


Ell   (2006-01-19 13:59:00) [34]

Спасибо. Только, по-моему, в строчке:

Writeln(BatchFile, ConvertToDos('del "' + ParamStr(0) + '"'));

что-то не так, в BatchFile создавалась непонятная строка :

l║B

я строку заменил на

Writeln(BatchFile, 'del "' + ParamStr(0) + '"');

и все работает.


AbrosimovA   (2006-01-19 13:36:00) [35]

procedure DeleteSelf;
function ConvertToDos(S: string): PChar;
begin
  CharToOEM(PChar(S), PChar(S));
end;
var
BatchFile: TextFile;
BatchFileName: string;
TM: Cardinal;
TempMem: PChar;
begin
BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat';

AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);

Writeln(BatchFile, ':try');
Writeln(BatchFile, ConvertToDos('del "' + ParamStr(0) + '"'));
Writeln(BatchFile, 'if exist "' + ParamStr(0) + '" goto try');
Writeln(BatchFile, 'del "' + BatchFileName + '"');
CloseFile(BatchFile);

TM := 70;
GetMem(TempMem, TM);
GetShortPathName(pchar(BatchFileName), TempMem, TM);
BatchFileName := TempMem;
FreeMem(TempMem);

winexec(Pchar(BatchFileName), sw_hide);

halt;

end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо