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

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

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

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

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

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

Имеется такой код:
Код:
begin
  NewLocation := PAnsiChar(GetNewFolder + 'NewFile.exe');
  if ParamStr(0) <> NewLocation then
  begin
    CopyFile(PAnsiChar(ParamStr(0)), NewLocation, False);
    ShellExecuteA(0, 'open', NewLocation, PAnsiChar(ParamStr(0)), nil, 0);
    Halt
  end
  else
  begin
    DeleteFile(PAnsiChar(ParamStr(1)));
  end;
То есть, файл копирует себя в папку и самоудаляется. На Windows 7 - все отлично. На XP - копирует, запускает, но не самоудаляется. в чем может быть причина? есть альтернативы?

Последний раз редактировалось iLnes; 13.02.2012 в 19:19.
iLnes вне форума Ответить с цитированием
Старый 13.02.2012, 19:05   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
в чем может быть причина?
Подсказка: DeleteFile - это функция.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 13.02.2012, 19:25   #3
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

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

Функция возвращает значение. А ты с ним что делаешь? Игнорируешь. Почему?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 13.02.2012, 19:32   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Нажимаем F1:

Цитата:
Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero (0). To get extended error information, call GetLastError.
И вот ещё кусочек для размышления:

Цитата:
Checks the return value of a Windows API call and raises an appropriate exception when it indicates failure.

Call Win32Check with the return value of a Windows API call that returns a Boolean to indicate success or failure. If the Windows API returns False (indicating failure), Win32Check calls RaiseLastOSError to raise an exception.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 13.02.2012, 19:42   #6
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Код:
    if(not DeleteFile(PAnsiChar(ParamStr(1)))) then
    ShowMessage('Cannot delete file :' + SysErrorMessage(GetLastError));
Пробовал так, даже ошибку не выводит


@UPD А нет, извиняюсь. Выбило ошибку: "Не удается найти указанный файл".

Последний раз редактировалось iLnes; 13.02.2012 в 19:47.
iLnes вне форума Ответить с цитированием
Старый 13.02.2012, 20:45   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

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

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Ну, вот вам и причина.
Тогда почему на 7 работает, а на XP не хочет ?!
iLnes вне форума Ответить с цитированием
Старый 13.02.2012, 21:53   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

(Вздох)

Потому что версия ОС тут ни при чём.

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

"Вчера я ехал на красный свет в зелёной машине и нормально проехал, а сегодня я ехал в синей машине на красный свет и меня остановили и взяли штраф! Почему меня остановили в синей машине, но не в зелёной?" Казалось бы: причём тут цвет машины?

Вот и у тебя так же. Ты обращаешь внимание на самое заметное (цвет машины/версию ОС), не замечая тот факт, что это не имеет никакого отношения к проблеме, это случайность, так кубики выпали. А проблема-то не в этом, она в твоих ошибках.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 13.02.2012 в 22:09.
GunSmoker вне форума Ответить с цитированием
Старый 13.02.2012, 22:16   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

P.S. Кстати, топик показывает важность проверки на ошибки, т.к. изначально при просмотре я заметил другой баг в коде, но всё же решил не говорить, а подвести к решению по частям, начав с правильной обработки ошибок. В итоге, как оказалось, ситуация у вас другая, не та, что я предполагал изначально. Итого, у вас уже найдено 2 бага в коде.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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