Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2010, 23:25   #1
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
Вопрос Проблема с записью в bat файл русских символов

Ниже описана процедура для удаление программы самой себя.
Создаём bat файл с именем себя любимого, в него записываем смертный приговор себе ну или ещё кому , запускаем его, закрываемся, всё никаких следов не осталось.

Всё это отлично работает, но только в тех случаях если в пути папки программы нет русских символов. Всё дело в таблице символов которую использует Delphi и cmd, они отличаются.

Можно ли решить эту проблему по простому не прибегая к конвертации файла, если нет то можно ссылочку на простой исходник такого конвертера если не сложно.

Код:
procedure Udalenie;
var
F: Textfile;
begin
AssignFile(F,Changefileext(Paramstr (0),'.bat'));
Rewrite(F);
Writeln(F,':1');
Writeln(F, Format('Erase "%s"',[Paramstr(0)]));
Writeln(F, Format('If exist "%s" Goto 1',[Paramstr(0)]));
Writeln(F, Format('Erase "%s"',[ChangeFileExt(Paramstr(0),'.bat')]));
CloseFile(F);
WinExec(PChar(ChangeFileExt(Paramst r(0),'.bat')),SW_HIDE);
Halt;
end;
Если есть более надёжные способы удалить саму себя прошу поделиться.
Как два байта переслать...
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 00:03   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код:
procedure Udalenie;
var
F: Textfile;
CurDir: String;
begin
CurDir := Paramstr(0);
AssignFile(F,ChangeFileExt(CurDir,'.bat'));
Rewrite(F);
Writeln(F,'delete $1'); // Удаляем прогу
Writeln(F,'delete $0'); // Удаляем батник
CloseFile(F);
WinExec(PChar(ChangeFileExt(CurDir,'.bat ')  + CurDir),SW_HIDE);
Halt;
end;
psycho-coder вне форума Ответить с цитированием
Старый 22.11.2010, 00:26   #3
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
По умолчанию

Ну и что это получилось? - bat файл с содержимым:
Код:
delete $1
delete $0
Ни каково эффекта это не даёт
Как два байта переслать...
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 00:30   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от TrapQ Посмотреть сообщение
Ну и что это получилось? - bat файл с содержимым:
Код:
delete $1
delete $0
Ни каково эффекта это не даёт
Упс Должно быть
delete %1
delete %0

Ошибся))
psycho-coder вне форума Ответить с цитированием
Старый 22.11.2010, 00:50   #5
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
Упс Должно быть
delete %1
delete %0

Ошибся))
Ты сам то пробовал что написал?
Я честно не знаю что такое %1 и %0 но то что это не работает абсолютно точно, это не удаляет ни батник ни программу даже если они будут лежать прямо на диске С:
Как два байта переслать...
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 00:55   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Грохни ее вот так... Проверил, вроде работает
Код:
procedure DeleteEXE;
  function GetTmpDir: string;
  var
    pc: PChar;
  begin
    pc := StrAlloc(MAX_PATH + 1);
    GetTempPath(MAX_PATH, pc);
    Result := string(pc);
    StrDispose(pc);
  end;

  function GetTmpFileName(ext: string): string;
  var
    pc: PChar;
  begin
    pc := StrAlloc(MAX_PATH + 1);
    GetTempFileName(PChar(GetTmpDir), 'uis', 0, pc);
    Result := string(pc);
    Result := ChangeFileExt(Result, ext);
    StrDispose(pc);
  end;
var
  batchfile: TStringList;
  batchname: string;
begin
  batchname := GetTmpFileName('.bat');
  FileSetAttr(ParamStr(0), 0);
  batchfile := TStringList.Create;
  with batchfile do
  begin
    try
      Add(':Label1');
      Add('del "' + ParamStr(0) + '"');
      Add('if Exist "' + ParamStr(0) + '" goto Label1');
      Add('rmdir "' + ExtractFilePath(ParamStr(0)) + '"');
      Add('del ' + batchname);
      SaveToFile(batchname);
      ChDir(GetTmpDir);
      ShowMessage('Софтинка удалена');
      WinExec(PChar(batchname), SW_HIDE);
    finally
      batchfile.Free;
    end;
    Halt;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DeleteEXE;
end;
_SERGEYX_ вне форума Ответить с цитированием
Старый 22.11.2010, 01:10   #7
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
По умолчанию

_SERGEYX_ твой способ работает не хуже моего, но к сожалению и не лучше!.

Опять проблема с русскими буквами в адресе программы, если они есть то ничего не работает.
=================================== =========
А вот способ содранный с faq
Код:
if CreateProcess( nil, PChar(batName), nil, nil, False, IDLE_PRIORITY_CLASS,   //or DETACHED_PROCESS для консольных пpиложений
nil, nil, si, pi ) then 
begin
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;
Но компилятор спотыкается на "si" подскажите как это запустить? И вообще это будет работать?
Как два байта переслать...
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 01:19   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Что бы проблем с путями не было, проще всего удалять не указывая путей, т.к. прога ведь лежит в том же каталоге, что и батник.
P.S. Надеюсь, название проги не кириллицей...
Arigato вне форума Ответить с цитированием
Старый 22.11.2010, 01:35   #9
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Что бы проблем с путями не было, проще всего удалять не указывая путей, т.к. прога ведь лежит в том же каталоге, что и батник.
P.S. Надеюсь, название проги не кириллицей...
Нет название проги по английски.
Как два байта переслать...

Последний раз редактировалось TrapQ; 22.11.2010 в 01:48.
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 01:36   #10
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от TrapQ Посмотреть сообщение
Ты сам то пробовал что написал?
Я честно не знаю что такое %1 и %0 но то что это не работает абсолютно точно, это не удаляет ни батник ни программу даже если они будут лежать прямо на диске С:
Ептя, Вы хотя бы пытались понять что я Вам написал?
Код:
del %1
del %0
Это команды доса. %0 это равносильно ParamStr(0) в дельфи, %1 - ParamStr(1) и т.д.
Если я не пользовался ими уже кучу времени и забыл как правильно они пишутся. То Вы могли бы и погуглить, что обозначают знаки процента в батниках.
Этот пример проверил, удаляет даже с русскими символами в пути
Код:
procedure Udalenie;
var
F: Textfile;
CurDir: String;
begin
CurDir := Paramstr(0);
AssignFile(F,ChangeFileExt(CurDir,'.bat'));
Rewrite(F);
Writeln(F,'del %1'); // Удаляем прогу
Writeln(F,'del %0'); // Удаляем батник
CloseFile(F);
WinExec(PChar(ChangeFileExt(CurDir,'.bat ')  + CurDir),SW_HIDE);
Halt;
end;
psycho-coder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с записью текста в файл AK BULLETS Помощь студентам 3 19.03.2010 19:22
Проблема с записью в файл baltushka Помощь студентам 0 14.06.2009 17:39
Проблема с записью структуры в файл JamS007 Общие вопросы C/C++ 5 07.01.2009 23:13
Проблема с записью в файл...( Regloger Помощь студентам 10 15.11.2007 17:49