2012-02-06 20 views
23

I asked this question trong ngữ cảnh thiết kế tổng quát hơn trước đây. Bây giờ, tôi muốn nói về các chi tiết cụ thể.Làm thế nào để một nhị phân C++ thay thế chính nó?

Hãy tưởng tượng rằng tôi có app.exe đang chạy. Nó tải xuống update.exe vào cùng một thư mục. Làm cách nào để app.exe sao chép update.exe qua nội dung của app.exe? Tôi yêu cầu cụ thể trong một ngữ cảnh C++. Tôi có cần một số loại ứng dụng hòa giải thứ 3 không? Tôi có cần phải lo lắng về việc khóa tập tin không? Cách tiếp cận mạnh mẽ nhất cho bản cập nhật nhị phân là gì (chặn nhân viên CNTT đáng ghét có quyền truy cập tệp cực)? Lý tưởng nhất, tôi muốn xem các giải pháp di động (Linux + OSX), nhưng Windows là mục tiêu chính.

+0

Theo như tôi biết, Windows sẽ không cho phép bạn ghi đè EXE khi chương trình đang chạy. Đây là một trong những điều khó chịu nhất trong Windows, imo. – unwind

+1

Như tôi đã nói với bạn về câu hỏi khác, bạn không thể ghi đè lên một exe thats đang chạy. Tôi thậm chí còn đưa ra các hướng dẫn từng bước về cách thực hiện toàn bộ quá trình này. –

+0

@MooingDuck Tôi biết! Tôi vẫn đang tham khảo câu trả lời của bạn như một thiết kế cấp cao. Tôi chỉ đơn giản là thu hẹp phạm vi cho câu hỏi cụ thể này. Đã, tôi khá hài lòng với câu trả lời. – TheBuzzSaw

Trả lời

35
  1. Move/Đổi tên của bạn đang chạy app.exe-app_old.exe
  2. Move/Đổi tên tải về của bạn update.exe-app.exe
  3. Với lần bắt đầu tiếp theo của ứng dụng, bản cập nhật sẽ được sử dụng

Đổi tên tệp dll/exe đang chạy không phải là vấn đề trong cửa sổ.

+7

không biết bạn có thể đổi tên một tệp thực thi đang chạy! –

+0

Điều này làm việc khá tốt cho tôi, sửa chữa gà và vấn đề trứng với updater của tôi. – Boccobrock

9

Đó là một tính năng của hệ điều hành - không phải là tính năng C++.
Bạn đang sử dụng hệ điều hành nào?

Trong Windows thấy MoveFileEx() chức năng, trên linux chỉ đơn giản là ghi đè lên các ứng dụng đang chạy (Replacing a running executable in linux)

+0

+1 cho liên kết đến chủ đề khác. Giải pháp linux là tuyệt vời! – Nawaz

7

Trên Linux có thể loại bỏ các thực thi của một chương trình đang chạy, do đó:

  • tải app.exe~
  • xóa chạy app.exe
  • đổi tên app.exe~ để app.exe

Trên Windows nó không thể xóa tệp thực thi của chương trình đang chạy, nhưng có thể đổi tên chương trình đó:

  • tải app.exe~
  • đổi tên chạy app.exe để app.exe.old
  • đổi tên app.exe~-app.exe
  • khi khởi động lại loại bỏ app.exe.old
2

Trên Windows ít nhất một ứng dụng chạy được khóa tập tin .exe của riêng mình và tất cả các tệp .dll được liên kết tĩnh. Điều này ngăn không cho ứng dụng tự cập nhật trực tiếp, tại khách hàng tiềm năng nếu muốn ngăn chặn khởi động lại (nếu khởi động lại OK, ứng dụng có thể chuyển cờ MOVEFILE_DELAY_UNTIL_REBOOT sang MoveFileEx và được tự do 'ghi đè' đó là .exe riêng, như vẫn bị trì hoãn). Đây là lý do tại sao các ứng dụng thông thường không kiểm tra các bản cập nhật trên riêng của chúng .exe, nhưng chúng khởi động một shim để kiểm tra các bản cập nhật và sau đó khởi chạy ứng dụng 'thực'. Trong thực tế, 'shim' thậm chí có thể được thực hiện bởi chính hệ điều hành, nhờ vào tệp kê khai được định cấu hình đúng. Visual Studio ứng dụng được xây dựng có được điều này như là một công cụ đóng gói thuật sĩ prefab, xem ClickOnce Deployment for Visual C++ Applications.

Ứng dụng Linux điển hình không cập nhật chính nó do nhiều ứng dụng của nhiều hệ điều hành. Hầu hết các ứng dụng được phân phối dưới dạng nguồn, chạy một số phiên bản của tự động địa ngục để tự cấu hình và tự xây dựng, sau đó tự cài đặt thông qua make install (tất cả chúng có thể được tự động hóa sau gói). Ngay cả các ứng dụng được phân phối dưới dạng nhị phân cho một hương vị cụ thể của Linux không tự sao chép, nhưng thay vào đó hãy cài đặt phiên bản mới cạnh nhau và sau đó chúng cập nhật symbolic link để 'kích hoạt' phiên bản mới (một lần nữa, quản lý gói phần mềm có thể ẩn nội dung này).

Ứng dụng OS X nằm trong nhóm Linux nếu chúng thuộc về hương vị Posix hoặc ngày nay rơi vào nhóm ứng dụng Mac AppStore xử lý các bản cập nhật cho bạn.

Tôi mong rằng việc tự cập nhật sẽ không bao giờ đạt được sự tinh tế của một trong hai công nghệ này (ClickOnce, RPM, AppStore) và cung cấp cho người dùng khả năng phát hiện, nâng cấp và gỡ cài đặt. Tôi sẽ đi với dòng chảy và sử dụng các công nghệ này trong nền tảng tương ứng của họ.

+0

Còn các ứng dụng chạy liên tục thì sao? Trong trường hợp của tôi, ứng dụng chạy tất cả thời gian và tích cực thăm dò để cập nhật (ngoài việc thực hiện các nhiệm vụ khác nhau của nó). Bạn vẫn khuyên bạn nên sử dụng những công cụ cập nhật tương tự? – TheBuzzSaw

+0

LÀ người dùng ứng dụng tương tác hoặc daemon/dịch vụ? Các ứng dụng tương tác của người dùng như ClickOnce có thể thông báo cho người dùng. loại daemon/dịch vụ phụ thuộc vào môi trường: trong môi trường doanh nghiệp, chúng được cập nhật bởi quản trị viên, những người rất miễn cưỡng trên các ứng dụng tự động tải xuống và chạy các bit mới (chưa được kiểm tra và quan trọng hơn là có khả năng bị xâm nhập). Một daemon/dịch vụ người tiêu dùng sẽ có một thời gian dễ dàng hơn bán những lợi ích của việc tự cập nhật. –

+0

Tôi sẽ phân loại nó là một daemon/dịch vụ. Về cơ bản, nó là có để trích xuất dữ liệu (như được cho phép bởi người sử dụng). Tuy nhiên, lỗi xuất hiện.Một ví dụ ngẫu nhiên có thể là tên của mọi người đang đi ngược lại. Tôi muốn có thể đẩy ra một sửa lỗi nhỏ mà không cần phải cài đặt toàn bộ phần mềm. – TheBuzzSaw

2

Chỉ là một ý tưởng để khắc phục sự cố "khởi động lại". Làm thế nào về thực hiện một chương trình, mà không cần phải được cập nhật. Chỉ cần thực hiện nó trong một cấu trúc plugin, vì vậy nó chỉ là một máy chủ cập nhật mà chính nó tải một tập tin .dll với tất cả các chức năng chương trình của bạn cần và gọi chức năng chính ở đó. Khi nó phát hiện một bản cập nhật (có thể trong một chủ đề riêng biệt), nó cho dll xử lý để đóng, thay thế các tập tin và tải mới. Bằng cách này, ứng dụng của bạn tiếp tục chạy trong khi nó tự cập nhật (chỉ có tệp dll được tải lại nhưng ứng dụng vẫn tiếp tục chạy).

0

Sử dụng trình cập nhật thứ 3 có thể chạy được như nhiều ứng dụng khác.

  • Tải xuống phiên bản mới.
  • Lên lịch trình cập nhật của bạn để thay thế ứng dụng bằng phiên bản mới.
  • Đóng ứng dụng chính.
  • Trình chạy Updater và thực hiện công việc.
  • Trình cập nhật chạy phiên bản ứng dụng mới của bạn.
  • Thoát khỏi kho lưu trữ.
Các vấn đề liên quan