Як можна замінити бінарний код C ++?

Я задав це питання у більш загальному контексті дизайну. Тепер я хотів би поговорити про специфіку.

Уявіть, що у мене працює app.exe . Він завантажує update.exe в ту ж папку. Як app.exe копіюватиме update.exe на вміст app.exe ? Я прошу конкретно в C ++ контексті. Чи потрібен мені якийсь додаток третього посередника? Чи потрібно турбуватися про блокування файлів? Що є найбільш надійним підходом до самого бінарного оновлення (забороняючи неприємний ІТ-персонал, який має екстрені права доступу до файлів)? В ідеалі я хотів би бачити портативні рішення (Linux + OSX), але Windows є основною метою.

28
Наскільки я знаю, Windows не дозволить вам перезаписати EXE під час запуску програми. Це одне з найбільш прикрих речей у Windows, imo.
додано Автор unwind, джерело
Як я вже говорив вам на це інше питання, ви не можете перезаписати exe, що працює. Я навіть дав покрокові інструкції, як робити весь цей процес.
додано Автор Mooing Duck, джерело
@MooingDuck Я знаю! Я все ще посилаюся на вашу відповідь як на високий рівень дизайну. Я просто звужую рамки для цього конкретного питання. Я вже задоволений відповідями.
додано Автор TheBuzzSaw, джерело

6 Відповіді

  1. Move/Rename your running app.exe to app_old.exe
  2. Move/Rename your downloaded update.exe to app.exe
  3. With the next start of your application the update will be used

Перейменування запущеного, тобто заблокованого dll/exe, не є проблемою під вікнами.

40
додано

Це функція операційної системи - не C ++ На якій ОС ви працюєте?

У Windows перегляньте MoveFileEx ( ) , на Linux просто перезапишіть запущену програму ( Заміна запущеного виконуваного файлу в linux )

9
додано

На Linux можна видалити виконуваний запуск програми, отже:

  • download app.exe~
  • delete running app.exe
  • rename app.exe~ to app.exe

У Windows неможливо видалити виконуваний запуск програми, але можна перейменувати її:

  • download app.exe~
  • rename running app.exe to app.exe.old
  • rename app.exe~ to app.exe
  • when restarting remove app.exe.old
8
додано

У Windows принаймні запущена програма блокує свій власний .exe-файл і всі статично пов'язані .dll-файли. Це запобігає оновленню програми безпосередньо, у провідниках, якщо воно бажає запобігти повторному завантаженню (якщо повторне завантаження в порядку, програма може передати прапорець MOVEFILE_DELAY_UNTIL_REBOOT до MoveFileEx і вільно перезаписувати 'це власний .exe, як і затягується). Ось чому зазвичай програми не перевіряють наявність оновлень на їх власному .exe, але вони запускають прокладку, яка перевіряє наявність оновлень, а потім запускає «реальне» додаток. Фактично "shim" може бути виконаний навіть самою ОС, завдяки правильно налаштованому файлу маніфесту. Вбудована у Visual Studio програма отримує це як пакувальний засіб зібраного майстра, див. Розгортання ClickOnce для додатків Visual C ++ .

Типова програма для Linux не оновлюється через багато безліч різновидів ОС. Більшість додатків розповсюджуються як джерело, запускаються через певну версію авто-пекла, щоб самостійно налаштовуватись та будувати себе, а потім встановлювати їх через make install (все це можна автоматизувати за пакетом). Навіть програми, які поширюються як двійкові файли для певного виду Linux, не копіюють себе, а замість них інсталюють нову версію, а потім оновлюють символьне посилання , щоб" активувати "нову версію (знову ж таки, це може приховати програмне забезпечення для керування пакетами).

Додатки OS X потрапляють або в відро Linux, якщо вони мають смак Posix, або в даний час потрапляють у відро для додатків Mac AppStore, який обробляє оновлення.

Я б коли-небудь, що прокат самостійного оновлення ніколи не досягне витонченості будь-якої з цих технологій (ClickOnce, RPMs, AppStore) і запропонує користувачеві очікувану поведінку щодо виявлення, оновлення та видалення. Я б пішов з потоком і використовував ці технології у відповідних платформах.

2
додано
Чи є інтерактивний користувач програми або демон/служба? Інтерактивні програми для користувачів, такі як ClickOnce, можуть сповістити користувача. Демон/тип послуги залежить від середовища: в корпоративному середовищі вони оновлюються адміністраторами, які дуже неохоче ставляться до програм, щоб автоматично завантажувати і запускати нові біти (неперевірені і, що більш важливо, потенційно скомпрометовані). Демон/послуга споживача спростив би продаж переваг самозміни.
додано Автор Remus Rusanu, джерело
У 99% випадків програмне забезпечення буде працювати з обмеженими привілеями і не зможе самостійно оновлюватись без користувача, що визнає підвищений контекст ( sudo , UAC , Рамка авторизації )
додано Автор Remus Rusanu, джерело
А як щодо програм, що працюють постійно? У моєму випадку, програма працює весь час і активно досліджує оновлення (на додаток до виконання різних завдань). Ви б як і раніше рекомендували використовувати ті ж самі засоби оновлення?
додано Автор TheBuzzSaw, джерело
Я б класифікував його як демон/сервіс. В принципі, він витягує дані (як це дозволено користувачем). Проте з'являються помилки. Довільним прикладом може бути те, що імена людей надходять у зворотному напрямку. Я хочу бути в змозі виштовхнути крихітний виправити помилку, не всі надмірності повномасштабної установки програмного забезпечення.
додано Автор TheBuzzSaw, джерело

Просто ідея подолати проблему "перезавантаження". Як щодо створення програми, яка не потребує оновлення. Просто реалізуйте його у структурі плагінів, так що це лише хост оновлення, який сам завантажує файл .dll з усіма функціональними можливостями, які потрібні вашій програмі, і викликає головну функцію. Коли він виявляє оновлення (можливо, в окремому потоці), він повідомляє рукоятку dll закрити, замінює файл і завантажує новий. Таким чином, ваша програма продовжує працювати під час оновлення (лише dll-файл перезавантажується, але програма продовжує працювати).

2
додано

Використовуйте третій виконуваний файл, як і багато інших програм.

  • Завантажити нову версію.
  • Плануйте оновлення, щоб замінити програму новою версією.
  • Закрити головну програму.
  • Програма оновлення запускається та виконує роботу.
  • Оновлення запускає нову версію вашої програми.
  • Оновлення закривається.
0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147