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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2013, 11:10   #1
RageGod
Пользователь
 
Регистрация: 08.05.2012
Сообщений: 35
По умолчанию Избавиться от модулей SysUtils и Classes

Хочется после определенных действий удалять свой .exe
Имеется такой код, который стабильно работает:
Код:
procedure SelfDelete;
var
  Bat : TStringList;
  Self : String;
  sPath : String;
begin
  GetDir(0,sPath);
  Self := ExtractFileName(Application.ExeName);
  Bat := TStringList.Create;
  Bat.Add(':Repeat');
  Bat.Add('del '+Self);
  Bat.Add('if exist '+Self+' goto Repeat');
  Bat.Add('del Temp.bat');
  Bat.SaveToFile(sPath+'\Temp.bat');
  ShellExecute(Form1.Handle,nil,PAnsiChar(sPath+'\Temp.bat'),nil,nil,SW_HIDE);
  Application.Terminate;
end;
Пробовал переписать без использования моделей, но почему-то не удаляло файл, если в пути к файлу присутствовали юникод символы.
помогите переделать
RageGod вне форума Ответить с цитированием
Старый 12.02.2013, 11:19   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, у Вас не только с уникодными символами будут проблемы!
(см. тему)
Дело в том, что в BATниках русские буквы в кодировке DOS (она же 866. она же OEM), Delphi (как Win32 программа работает с кодировкой, установленной в локали - для русской локали это кодировка Win -1251, она же - ANSI).
нужно было всего навсего перекодировать ANSI -> OEM и всех делов!

И чтобы избавится от проблем с уникодом, думаю, что получение короткого имени файла поможет.

А при чём здесь модули SysUtils и Classes ? Чем они Вам не угодили?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.02.2013, 12:29   #3
RageGod
Пользователь
 
Регистрация: 08.05.2012
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, у Вас не только с уникодными символами будут проблемы!
(см. тему)
Дело в том, что в BATниках русские буквы в кодировке DOS (она же 866. она же OEM), Delphi (как Win32 программа работает с кодировкой, установленной в локали - для русской локали это кодировка Win -1251, она же - ANSI).
нужно было всего навсего перекодировать ANSI -> OEM и всех делов!

И чтобы избавится от проблем с уникодом, думаю, что получение короткого имени файла поможет.

А при чём здесь модули SysUtils и Classes ? Чем они Вам не угодили?!
Спасибо.
Но тот метод мне не подходит, т.к все таки пользователь может переименовать файл...

Модули при том, что ограничен в размерах. Требуется небольшое приложение, вот и все.

Последний раз редактировалось RageGod; 12.02.2013 в 12:32.
RageGod вне форума Ответить с цитированием
Старый 12.02.2013, 12:40   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

модули SysUtils и Classes на размер файла не сильно то и влияют ... а вот попробуй удалить Forms
а если нужен небольшой размер - пользуйся упаковщиками (UPX и т.п.)
и еще по коду: почему TStringList ? ... обычного TextFile недостаточно ?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 12.02.2013, 14:09   #5
RageGod
Пользователь
 
Регистрация: 08.05.2012
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
модули SysUtils и Classes на размер файла не сильно то и влияют ... а вот попробуй удалить Forms
а если нужен небольшой размер - пользуйся упаковщиками (UPX и т.п.)
и еще по коду: почему TStringList ? ... обычного TextFile недостаточно ?
около 100кб добавляют
Думаю стоит сначала уменьшиь размер файла и так, а потом уже упаковщиком.
RageGod вне форума Ответить с цитированием
Старый 12.02.2013, 23:26   #6
RageGod
Пользователь
 
Регистрация: 08.05.2012
Сообщений: 35
По умолчанию

подниму тему.
кто-нибудь может помочь?
RageGod вне форума Ответить с цитированием
Старый 12.02.2013, 23:54   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

С чем? Берете используемые функции из модулей, вырезаете их и все, что они используют(тянут за собой). Складируете в своем модуле. Для пущего минимума можно ещё и System, SysInit, SysConsts подрезать. Но там уже надо знать, что резать. Многое зависит от многого.
Человек_Борща вне форума Ответить с цитированием
Старый 13.02.2013, 00:23   #8
RageGod
Пользователь
 
Регистрация: 08.05.2012
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
С чем? Берете используемые функции из модулей, вырезаете их и все, что они используют(тянут за собой). Складируете в своем модуле. Для пущего минимума можно ещё и System, SysInit, SysConsts подрезать. Но там уже надо знать, что резать. Многое зависит от многого.
Я видел реализацию самоудаления без использования данных модулей, "без вырезания используемых функций", правда как я уже и говорил, не удаляла файл, если он находился в каталоге, в котором присутствовали русские символы.

Вот так перевел код:
Код:
procedure Delete;
var
 s:string;
 f:textfile;
begin
  s:='Delete.bat';
  s:=ExtractFilePath(ParamStr(0)) + s;
  AssignFile(f, s);
  Rewrite(f);
  Writeln(f, ':f');
  Writeln(f, 'del "' + ParamStr(0));
  Writeln(f, 'if EXIST "' + ParamStr(0) + '" goto f');
  Writeln(f, 'del "' + s);
  CloseFile(f);
  WinExec(PChar(s), SW_HIDE);
end;
Код работает, но только, как я и говорил выше, если в пути присутствуют русские символы - не удаляется ни батник, ни .exe файл.
Как исправить?

Последний раз редактировалось RageGod; 13.02.2013 в 00:44.
RageGod вне форума Ответить с цитированием
Старый 13.02.2013, 00:55   #9
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  F : TextFile;
  eFile : string;
begin
  eFile := PChar(ExtractFileName(Application.ExeName));
  AnsiToOem(PChar(eFile), PChar(eFile));
  try
    AssignFile(F,'del.cmd');
    Rewrite(F);
    Writeln(F,':Repeat');
    Writeln(F,'del "'+eFile+'"');
    Writeln(F,'if exist "'+eFile+'" goto Repeat');
    Writeln(F,'del del.cmd');
    Flush(F);
  finally
    CloseFile(F);
  end;
  WinExec('del.cmd', 0);
  Application.Terminate;
end;
папка в которой был файл
Цитата:
C:\Users\Администратор\Desktop\Нова я папка (3)
у меня удаляются оба файла

UPD. изменил код с учётом
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, у Вас не только с уникодными символами будут проблемы!
(см. тему)
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 13.02.2013 в 01:24. Причина: доработан код
Yurk@ вне форума Ответить с цитированием
Старый 13.02.2013, 01:19   #10
Dik0n
 
Регистрация: 26.11.2012
Сообщений: 6
По умолчанию

Код:
procedure Delete;
var
 s:string;
 f:textfile;
begin
  s:='Delete.bat';
  s:=ExtractFilePath(ParamStr(0)) + s;
  AssignFile(f, s);
  Rewrite(f);
  Writeln(f, 'chcp 1251'); // меняем кодировку
  Writeln(f, ':f');
  Writeln(f, 'del "' + ParamStr(0));
  Writeln(f, 'if EXIST "' + ParamStr(0) + '" goto f');
  Writeln(f, 'del "' + s);
  CloseFile(f);
  WinExec(PChar(s), SW_HIDE);
end;
Dik0n вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка несоответствия типов после подключения System и Classes Alex Cones Общие вопросы Delphi 9 26.11.2017 10:36
Вставить текущую дату и время в строку, не используя SysUtils. Alex Cones Общие вопросы Delphi 8 16.12.2009 03:13
BinToHex из Classes. Как юзать и скормить ей большой String Alex Cones Общие вопросы Delphi 5 05.11.2009 17:18
Windows, Messages,SysUtils,Variants,... Рустам Общие вопросы Delphi 5 04.02.2008 08:34