| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > копирование файла по мере возможности |
| Автор: 17dufa 6.5.2010, 11:20 |
| Добрый день. Есть dll, которые в данный момент могут быть загружены каким-нить процессом. и есть новые версии этих dll. какой командой можно попросить винду заменить одни другими, так чтобы если dll загружены процессом функция замены отработала по завершению процесса? нашел нечто похожее: MoveFileTransacted и флаг MOVEFILE_DELAY_UNTIL_REBOOT (http://msdn.microsoft.com/en-us/library/aa365241%28v=VS.85%29.aspx) но хотелось бы не ждать ребута системы, а дождаться только завершения процессов, возможно? |
| Автор: xvr 6.5.2010, 12:10 |
| Не уверен, что получится, но попробовать можно: Переименуйте (через MoveFile) текущую dll, затем скопируйте новую dll |
| Автор: 17dufa 6.5.2010, 12:25 |
| xvr, поподробней можно? не до конца понимаю мысль. |
| Автор: xvr 6.5.2010, 12:38 |
| Мысль простая - удалить или перезаписать файл в процессе исполнения нельзя, но некоторые файлы можно переименовать. После этого можно записать новую версию файла под старым именем |
| Автор: 17dufa 6.5.2010, 12:47 |
| попробовал - работающий exe удалось сдвинуть. соответственно его изначальное место освободилось для новой версии. под какими версиями винды этот трюк отработает? у мя 7 стоит, мои тесты мало адекватны)))) |
| Автор: xvr 6.5.2010, 13:21 |
Под 2000 работает. Видимо под всеми остальными тоже |
| Автор: 17dufa 6.5.2010, 13:30 |
| от коллег поступили сведения, что может не сработать. оставлю этот вариант на заметке и буду писать exe который WaitForSingleObject ждет завершения процесса и потом выполняет копирование. благо обновлять пока собираемся только один exe. |
| Автор: Dem_max 10.5.2010, 11:46 |
| выгрузить эти dll посредством завершения программы, заменить файлы и снова запустить приложение с новыми dll |
| Автор: 17dufa 11.5.2010, 11:16 |
| Dem_max, не айс - работает се пользователь никого не трогает, вдруг бац, программка закрывается) плюс не отрабатывается ситуация нескольких запущенных процессов с одного exe файла. сделал так - запускается exe, который ждет пока в системе не исчезнут процессы с заданным именем. после этого копирует файлы из одной директории в другую. |
| Автор: GoldFinch 11.5.2010, 11:49 |
| 17dufa, делайте обновление не сразу же когда появились длл, а при следующем запуске программы, т.е. при запуске проверяйте надо ли делать обновление, если надо - заменяйте длл и перезапускайте программу. процесс который чего-то ждет могут прибить, или у пользователя может отрубиться свет |
| Автор: Dem_max 12.5.2010, 11:28 | ||
Я же не говорил прибить программу, а корректно закрыть, послав ей сообщение. |
| Автор: 17dufa 12.5.2010, 12:20 |
| Dem_max, спасибо за участие. тема закрыта. |