Chạy nhiều phiên bản của bất kỳ ứng dụng Windows nào


11

Giả sử một số tác giả đã thực thi ứng dụng Windows của mình thành một thể hiện duy nhất. Có cách nào để tạo nhiều phiên bản của ứng dụng này (ngoài việc chạy bên trong một máy ảo hoặc yêu cầu tác giả viết lại ứng dụng) không?

Nếu có một công cụ readymade, tôi muốn biết nó. (Tôi đã thử sandboxie và Altiris SVS mà không gặp may).

Nếu không có gì ngoài đó, tôi muốn lập trình một công cụ / hack sẽ cho phép tôi làm điều này. Tôi đang tìm kiếm con trỏ bắt đầu từ đâu - những gì sẽ tham gia, những kỹ năng cần thiết. Tôi có kỹ năng lập trình vừa phải trong C và Java.

Nếu điều này không thể được thực hiện, xin vui lòng giải thích tại sao.

EDIT: Tôi biết đó là một ý tưởng tồi nhưng tôi vẫn cần phải thực hiện nó (vì nhiều lý do). Tôi muốn một cách chung hoạt động cho bất kỳ ứng dụng nào và không giới thiệu lỗi.


3
Các ứng dụng Windows không phải là singletons theo mặc định. Nếu có, điều đó có nghĩa là ai đó đã nỗ lực thêm để biến nó thành một người độc thân và có lẽ có lý do để làm điều đó.
Trong silico

1
Phụ thuộc vào cách ứng dụng kiểm tra nhiều bản sao. Các ứng dụng khác nhau kiểm tra theo nhiều cách khác nhau và một số ứng dụng sẽ kiểm tra theo nhiều cách.
ho1

Như trong Silico nói, có lẽ đó không phải là một ý tưởng tốt. Ứng dụng có thể làm hỏng dữ liệu, sập hoặc gây ra các sự cố khác nếu bạn có nhiều bản sao đang chạy khi không có ý định.
ho1

Có nhiều cách một quy trình có thể thực thi chỉ chạy một thể hiện duy nhất; Tôi không nghĩ việc xây dựng một công cụ chung có khả năng ngăn chặn điều này là khả thi. Bạn sẽ phải kiểm tra từng ứng dụng riêng lẻ và viết một cái gì đó được thiết kế riêng cho nó.

Bạn đã tìm thấy một giải pháp?
Tomas

Câu trả lời:


2

Nhiều ứng dụng kiểm tra danh sách các quy trình toàn cầu (với EnumProcesses, OpenProcess, GetModuleBaseName và các chức năng tương tự) hoặc danh sách các cửa sổ (với EnumWindows, EnumChildWindows).

Bạn có thể thử đặt hook (xem các mẫu SetWindowsHookEx, CallNextHookEx, v.v.) để móc các lệnh gọi hàm API cụ thể đó từ ứng dụng đó và thay thế dữ liệu được yêu cầu để phản hồi ứng dụng của bạn.


Cảm ơn tất cả các câu trả lời. Tôi đoán các công cụ cần một số thiết kế cẩn thận. Công cụ được hình dung sẽ giống như một môi trường HĐH ảo rất nhẹ, không liên quan đến việc chạy một bản sao đầy đủ của các cửa sổ, nhưng đánh lừa tất cả các ứng dụng.
Jus12

4

Không có cách chung vì các ứng dụng khác nhau sử dụng các phương pháp khác nhau. Nhiều phương pháp liên quan đến việc cố gắng lấy một số tài nguyên trên toàn máy (hoặc, ít nhất là toàn người dùng) (ví dụ: một đối tượng đồng bộ hóa có tên, một tệp có tên và vị trí nổi tiếng hoặc giá trị đăng ký). Nếu ứng dụng thành công, thì nó giữ tài nguyên đó miễn là nó chạy. Nếu nó không thành công vì một thể hiện khác đã giữ tài nguyên, thì nó có thể cố gắng báo hiệu cho thể hiện ban đầu để nó có thể phản hồi.

Trong Windows 16 bit, khi một chương trình bắt đầu, HĐH đã chuyển cho nó một tay cầm duy nhất được gọi là HINSTANCE. Nó cũng sẽ được thông qua HINSTANCE của một quy trình hiện đang chạy bằng cách sử dụng cùng một tệp thực thi (nếu có). Trong những ngày đó, đó có lẽ là cách phổ biến nhất để chương trình biết nếu một bản sao đã chạy. Trong Windows 32 bit, với bộ nhớ được bảo vệ, không gian địa chỉ dành riêng cho quy trình và kết thúc đa nhiệm hợp tác, HINSTANCE không còn mang ý nghĩa tương tự.

Một số lượng nhỏ các ứng dụng làm điều này chỉ đơn giản là "khả năng sử dụng", nhưng đối với nhiều ứng dụng khác, có thể có một lý do chính đáng để thực thi các singletons. Bỏ qua điều đó có thể dẫn đến tham nhũng dữ liệu hoặc đơn giản là không chạy được.


3

Bạn có thể chạy ứng dụng trên các tài khoản người dùng khác nhau và kiểm tra cá thể sẽ không hoạt động nữa.


2

Điều đó là có thể!

Dưới đây là hình ảnh tôi chạy nửa đời 1 4x trong 4 cửa sổ tất cả được kết nối với cùng một máy chủ LAN, vấn đề duy nhất là bộ điều khiển không được liên kết độc lập với mỗi cửa sổ.

https://web.archive.org/web/20150315150158if_/http://img29.imageshack.us/img29/5642/yc0y.jpg

Để thực hiện việc này, bạn cần 'Process Explorer' - một chương trình cho phép bạn thực hiện cái được gọi là 'Đóng xử lý' trên quy trình con '\ BaseNamedObjects \ ValveHalfLifeLauncherMutex' hoặc một cái gì đó. nó không khó lắm đâu vào đây để được hướng dẫn chi tiết - http://am.half-lifecreations.com/forums/index.php?topic=479.0

Nhưng vâng, đó là cho thời gian bán hủy nhưng hãy lấy Process Explorer và tôi chắc chắn bạn sẽ có thể tìm thấy xử lý / quy trình nào bạn cần đóng để có được các chương trình bạn muốn chạy nhiều lần.

Tôi không hiểu tại sao các cửa sổ không triển khai các trò chơi đang chạy nhiều lần trong các phần tách / snaps như một tính năng! Rõ ràng là vì mọi người sẽ không mua nhiều PC ... cũng hãy xem SoftXSpand thực sự tuyệt vời, cho phép bạn chạy nhiều phiên bản windows như những người dùng độc lập


Đóng một tay cầm đột biến làm việc cho tôi. Nó không có thời gian bán hủy nhưng sử dụng mutex ở phía lập trình viên là khá phổ biến nên giải pháp này là loại chung chung.
AZ.

1

Khóa tệp, đường ống được đặt tên và các sự kiện đồng bộ hóa là một số cách phổ biến mà các ứng dụng sử dụng để kiểm tra chúng là trường hợp duy nhất đang chạy. Để khắc phục các tệp khóa, bạn phải ảo hóa hệ thống tệp, móc vào nó hoặc xóa thời gian cẩn thận (và điều đó có thể không hoạt động nếu nó cũng khóa tệp mở). Các đường ống được đặt tên và các sự kiện đồng bộ hóa sẽ khó khăn hơn nhiều vì bạn không có quyền kiểm soát tương tự từ bên ngoài ứng dụng mà bạn thực hiện với các tệp.


0

Trong Windows 8 trở lên, bạn giữ phím Shift và nhấp vào biểu tượng / nút của chương trình trên thanh tác vụ. Điều này sẽ khởi chạy thực thi một lần nữa. Nếu ứng dụng không tự kiểm tra bản sao, bạn sẽ có một cửa sổ mới.

Điều này sẽ có khả năng tạo ra xung đột với các tệp nội bộ của ứng dụng nếu nó mở ví dụ như tệp sqlite nội bộ, vì vậy bạn phải thực sự biết những gì bạn đang làm hoặc không quan tâm nếu có gì đó bị hỏng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.