![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли сделать, чтобы программа удаляла сама себя?
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;