Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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:25 Найти цитируемый пост)
не до конца понимаю мысль. 
Мысль простая - удалить или перезаписать файл в процессе исполнения нельзя, но некоторые файлы можно переименовать. После этого можно записать новую версию файла под старым именем


Автор: 17dufa 6.5.2010, 12:47
попробовал - работающий exe удалось сдвинуть. соответственно его изначальное место освободилось для новой версии. 
под какими версиями винды этот трюк отработает? у мя 7 стоит, мои тесты мало адекватны))))

Автор: xvr 6.5.2010, 13:21
Цитата(17dufa @  6.5.2010,  12:47 Найти цитируемый пост)
под какими версиями винды этот трюк отработает?

Под 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
Цитата

плюс не отрабатывается ситуация нескольких запущенных процессов с одного exe файла.

Я же не говорил прибить программу, а корректно закрыть, послав ей сообщение.

Автор: 17dufa 12.5.2010, 12:20
Dem_max, спасибо за участие. тема закрыта. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)