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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2012, 16:38   #21
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно и без батника, проверяя существует ли процесс созданный исходным exe-шником
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.02.2012, 18:36   #22
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно и без батника, проверяя существует ли процесс созданный исходным exe-шником
Код получиться объемнее.
Есть еще вариант, для малого веса, создавать и писать в строки bat с помощью WinApi. (найти пример в интернете не тяжело, а переписать под себя еще легче).
iLnes вне форума Ответить с цитированием
Старый 15.02.2012, 02:26   #23
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от iLnes Посмотреть сообщение
По поводу второго, то тут не вижу другого варианта. Использовать удаление через bat тоже как-то не хорошо. Может стоит попробывать сделать проверку, через if ... then ? Будет как-никак получше. А там уже, если не выполнилось условие, то сделать repeat.
Правильный вариант - подождать, пока процесс закроется и только потом удалять файл.

Только вот делается это существенно сложнее, чем правильная расстановка кавычек

Кратко алгоритм должен выглядеть так (есть два варианта, я предпочитаю первый):
1. Делаем копию своего описателя, указывая, что копия будет наследоваться.
2. Вызываем второй процесс, указывая в командной строке помимо старого имени файла ещё и скопированный описатель. Кроме того, создание процесса нужно делать с наследованием описателей.
3. Второй процесс вызывает функцию ожидания на описатель, переданный параметром.
4. Когда функция вернёт управление - файл можно удалять.
5. Описатель закрываем.

Или так:
1. Во втором процессе находим PID родителя.
2. Открываем процесс по PID, получая описатель. Если открытие не удаётся, считаем, что процесс уже завершён. Открывать надо с минимальными правами только на ожидание.
3. Второй процесс вызывает функцию ожидания на полученный описатель.
4. Когда функция вернёт управление - файл можно удалять.
5. Описатель закрываем.

Конечно, можно сделать и совсем просто:
Код:
while not DeleteFile(...) do Sleep(100);
Но это решение, хотя и просто, обладает существенным недостатком: если файл нельзя удалить по любой иной причине (скажем, удаление файла запрещено), то вместо показа сообщения об ошибке мы зависнем в бесконечном цикле.

Теоретически, можно попробовать анализировать код ошибки и повторять цикл только для определённого значения кода ошибки, но как-то это видится мне ненадёжным.

.bat файлы использовать крайне не рекомендую по следующим соображениям:
1. .bat файлы используют OEM кодировку. Что означает, что все строки нужно транслировать или у тебя будут большие проблемы с путями, содержащими русский язык.
2. .bat файлы - это только ANSI. Что означает, что у тебя будут проблемы с любыми путями, содержащими символы вне текущей кодовой страницы.
3. Пункты 1 и 2 можно попробовать обходить, конвертировав пути в короткие имена. Но надо понимать, что эта операция не всегда возможна. Короткие имена часто отсутствуют - особенно на 64-битных системах.

Короче, это довольно ненадёжный способ.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 15.02.2012, 12:57   #24
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

У меня в bat все нормально происходит даже путь и название когда на русском языке. В нем кирилица нормально воспринимается, а мутить сложное для простой програмки не стоит, еще неделю будешь искать решение), потому как 100% универсального решения нет в этом направлении. Я сам пробовал многое и с процессами мутил и отдельно exe создавалось для выгрузки и удаления, все не коректно работало иногда оставался второй exe файл или висло приложение в цикле в общем не всегда был нужный результат, в Viste да и наверное в Win7 вообще будут предупреждения и блокирование да и антивирус ругаться будет на непонятные движения. Попробуй bat что я предложил. Путь выбирай небольшой и имя файла без всяких пробелов тогда все будет в норме. Если программа пишется без Application замени в нем строки содержащие Application.ExeName на ParamStr(0);

Есть еще такой способ узнать имя и путь своего процесса в место Application.ExeName и ParamStr(0). Может пригодиться эта функция
Код:
function GetExeName: string;
begin
SetLength(result, MAX_PATH);
SetLength(result, GetModuleFileName(0, PAnsiChar(result), MAX_PATH));
end;

Последний раз редактировалось Aliens_wolfs; 16.02.2012 в 11:34.
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