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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 22:45   #11
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Я вас прекрасно понимаю, что вы пытаетесь меня самого подтолкнуть к ошибке, чтобы я её понял и додумался как исправить сам. Но пока, я не могу найти
iLnes вне форума Ответить с цитированием
Старый 13.02.2012, 22:49   #12
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Если функция DeleteFile говорит, что ты передал в неё что-то не то, то наверное надо проверить, что ты в неё передал?

Например так:
Код:
ShowMessage(Format('Удаляю файл "%s"', [ParamStr(1)]));
if not DeleteFile(PAnsiChar(ParamStr(1))) then
  ShowMessage(Format('Не могу удалить файл. Ошибка: %s', [SysErrorMessage(GetLastError)]));
А если ты уже проверил - то об этом, вообще-то, надо бы тут сказать.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 13.02.2012, 23:25   #13
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Функция передала такое (судя по окну, в котором написано, что мы удаляем):
'Удаляю файл "C:\Documents"'' и все То есть, возвращает не то, что надо.
iLnes вне форума Ответить с цитированием
Старый 13.02.2012, 23:27   #14
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Верно, а теперь наводящий вопрос: как бы ты передал своей программе два параметра?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 13.02.2012, 23:36   #15
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Верно, а теперь наводящий вопрос: как бы ты передал своей программе два параметра?
не знаю

Было мысля, как вариант, сделать назождение файла через ExtractFilePath и уже в DeleteFile передавать его, а не ParamStr.
iLnes вне форума Ответить с цитированием
Старый 13.02.2012, 23:48   #16
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вообще-то трактовка командной строки остаётся на усмотрение программы, но в 99.99% случаев используют стандартное соглашение. Заключается оно в следующем.

Параметры указываются через пробел. Например:

program.exe первый-параметр второй-параметр

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

Например:

program.exe C:\Documents and settings\UserName\Documents\program .exe

Эквивалентно:
ParamStr(1) = C:\Documents
ParamStr(2) = and
ParamStr(3) = settings\UserName\Documents\program .exe

Чтобы указать, что пробел является частью параметра, используют кавычки. Например:

program.exe "C:\Documents and settings\UserName\Documents\program .exe"

ParamStr(1) = C:\Documents and settings\UserName\Documents\program .exe

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

Например:

program.exe "Show me ""the money"""

ParamStr(1) = Show me "the money"

Это что касается проблемы 1.

Проблема 2:
Что произойдёт, если DeleteFile выполнится ДО Halt?

P.S. Идиотские пробелы в "program .exe" вставил не я, а форум.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 14.02.2012, 00:06   #17
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

По поводу 1 проблемы:
Таааак, осознал ошибку) Проблема в этих ковычках Но что тогда перед удаления файла стоит присвоить ParamStr(1) ? Ведь я понял, что Windows обрезает грубо говоря путь к файлу. Т.к путь к файлу воспринимает как 3 разных параметра.

По поводу 2 проблемы:
ну по тестам на Windows 7 на протяжении 4 дней, сбоев не давало.
iLnes вне форума Ответить с цитированием
Старый 14.02.2012, 00:15   #18
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от iLnes Посмотреть сообщение
Но что тогда перед удаления файла стоит присвоить ParamStr(1) ?
Его не надо присваивать. Его надо правильно передавать. Тебе нужно при указании параметров в ShellExecute завернуть имя файла в кавычки:

ShellExecute(... PChar(AnsiQuotedStr(ParamStr(0), '"')), ...);

Цитата:
Сообщение от iLnes Посмотреть сообщение
ну по тестам на Windows 7 на протяжении 4 дней, сбоев не давало.
Надо как бы понимать, что если ты каждый день перебегаешь дорогу у дома на красный свет и тебя ещё пока не сбила машина - это ещё ни разу не означает, что это - правильно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 14.02.2012, 15:37   #19
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Его не надо присваивать. Его надо правильно передавать. Тебе нужно при указании параметров в ShellExecute завернуть имя файла в кавычки:

ShellExecute(... PChar(AnsiQuotedStr(ParamStr(0), '"')), ...);



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

По поводу второго, то тут не вижу другого варианта. Использовать удаление через bat тоже как-то не хорошо. Может стоит попробывать сделать проверку, через if ... then ? Будет как-никак получше. А там уже, если не выполнилось условие, то сделать repeat.
iLnes вне форума Ответить с цитированием
Старый 14.02.2012, 16:12   #20
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот классная простая функция найденная давно мною на просторах интернета, по самозавершению и удалению. Создает bat файл от туда завершает и удаляет файл затем bat, все просто. Сам ей пользуюсь иногда, перепробовал многое, но остановился на этой простой функции. Автору спасибо за простату и работу этой функции.

Были проблемы тоже в pach, нестал заморачиватся и применил стандартный метод заменил ParamStr(0) на Application.ExeName;

Если без Application то тогда разберать путь как предложил GunSmoker

Вот код функции:
Код:
//Функция по завершению и удалению саму себя
procedure MyDellete;
var
  BatchFile: TextFile;
  BatchFileName: string;
  TM: Cardinal;
  TempMem: PChar;
begin
  BatchFileName:=ExtractFilePath(Application.ExeName) + '$$336699.bat';
  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);
  Writeln(BatchFile,':try');
  Writeln(BatchFile,'del "' + Application.ExeName + '"');
  Writeln(BatchFile,'if exist "' + Application.ExeName + '" 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;

//Использовать так
procedure TForm1.Button1Click(Sender: TObject);
begin
MyDellete;
end;

Последний раз редактировалось Aliens_wolfs; 14.02.2012 в 16:59.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
самоудаление DeDoK Общие вопросы Delphi 10 31.01.2021 23:26
Самоудаление и автозапуск CyberViper Общие вопросы Delphi 1 31.05.2010 11:55
Перед открытием файла программа должна спрашивать адрес файла Belii09878 Помощь студентам 1 07.03.2010 16:37
Перезапись файла без путя или определение расположения файла программы The Best Общие вопросы Delphi 4 13.07.2009 22:50