Jalankan banyak instance dari aplikasi windows apa saja

11

Misalkan beberapa penulis telah menerapkan aplikasi Windows-nya menjadi satu instance. Apakah ada cara untuk membuat banyak instance dari aplikasi ini (selain berjalan di dalam mesin virtual atau meminta penulis untuk menulis ulang aplikasi)?

Jika ada alat readymade, saya ingin mengetahuinya. (Saya sudah mencoba sandboxie dan Altiris SVS tanpa hasil).

Jika tidak ada apa-apa di luar sana, saya ingin memprogram alat / hack yang akan membiarkan saya melakukan ini. Saya mencari petunjuk di mana untuk memulai - apa yang akan terlibat, keterampilan apa yang dibutuhkan. Saya memiliki keterampilan pemrograman sedang di C dan Java.

Jika ini tidak dapat dilakukan, tolong jelaskan mengapa.

EDIT: Saya tahu itu ide yang buruk tetapi saya masih perlu melakukannya (karena berbagai alasan). Saya ingin cara umum yang berfungsi untuk aplikasi apa pun dan tidak memperkenalkan kesalahan.

Jus12
sumber
3
Aplikasi Windows bukanlah lajang secara default. Jika ya, itu berarti seseorang berusaha lebih keras untuk menjadikannya singleton dan mungkin punya alasan untuk melakukannya.
Di silico
1
Tergantung pada bagaimana aplikasi memeriksa banyak salinan. Berbagai aplikasi memeriksa dengan cara yang berbeda dan beberapa aplikasi akan memeriksa dengan berbagai cara.
ho1
Seperti yang dikatakan In Silico, itu mungkin bukan ide yang baik. Aplikasi ini dapat merusak data, macet, atau menyebabkan masalah lain jika Anda menjalankan banyak salinan saat itu tidak dimaksudkan.
ho1
Ada banyak cara suatu proses dapat menjalankan hanya menjalankan satu contoh; Saya rasa tidak mungkin untuk membangun alat generik yang mampu mencegah hal ini. Anda harus memeriksa setiap aplikasi secara individual dan menulis sesuatu yang dirancang khusus untuk itu.
Sudahkah Anda menemukan solusinya?
Tomas

Jawaban:

2

Banyak aplikasi memeriksa daftar proses global (dengan EnumProcesses, OpenProcess, GetModuleBaseName, dan fungsi serupa) atau daftar windows (dengan EnumWindows, EnumChildWindows).

Anda dapat mencoba mengatur kait (lihat contoh SetWindowsHookEx, CallNextHookEx, dll) untuk mengaitkan panggilan fungsi API tertentu dari aplikasi itu dan mengganti data yang diminta sebagai tanggapan dengan Anda untuk mengelabui aplikasi.


sumber
Terima kasih atas semua jawabannya. Saya kira alat ini membutuhkan desain yang cermat. Alat yang dibayangkan harus agak seperti lingkungan OS virtual yang sangat ringan yang tidak melibatkan menjalankan salinan penuh windows, namun menipu semua aplikasi.
Jus12
4

Tidak ada cara umum karena aplikasi yang berbeda menggunakan metode yang berbeda. Banyak metode yang melibatkan mencoba mendapatkan beberapa sumber daya seluruh mesin (atau, setidaknya, seluruh pengguna) (misalnya, objek sinkronisasi bernama, file dengan nama dan lokasi terkenal, atau nilai registri). Jika aplikasi berhasil, maka ia menyimpan sumber daya itu selama itu berjalan. Jika gagal karena instance lain sudah memegang sumber daya, maka ia mungkin mencoba memberi sinyal instance asli sehingga dapat merespons.

Di Windows 16-bit, ketika sebuah program dimulai, OS memberikannya pegangan unik yang disebut HINSTANCE. Itu juga akan melewati HINSTANCE dari proses yang sedang berjalan menggunakan executable yang sama (jika ada). Pada masa itu, itu mungkin cara yang paling umum bagi program untuk mengetahui apakah salinannya sudah berjalan. Di Windows 32-bit, dengan memori terproteksi, ruang alamat khusus proses, dan akhir multitasking kooperatif, HINSTANCEs tidak lagi memiliki makna yang sama.

Sejumlah kecil aplikasi melakukan ini hanya untuk "kegunaan", tetapi bagi banyak orang lain, mungkin ada alasan bagus untuk menegakkan lajang. Memotong yang dapat menyebabkan korupsi data atau gagal menjalankannya.

Adrian McCarthy
sumber
3

Anda dapat menjalankan aplikasi pada akun pengguna yang berbeda dan pemeriksaan contoh tidak akan berfungsi lagi.

Tomas
sumber
2

Itu mungkin!

Berikut ini adalah gambar saya menjalankan waktu paruh 1 4x dalam 4 jendela semua terhubung ke server LAN yang sama, satu-satunya masalah adalah pengendali tidak terhubung secara independen ke setiap jendela.

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

Untuk melakukan ini, Anda memerlukan 'Process Explorer' - sebuah program yang memungkinkan Anda untuk melakukan apa yang dikenal sebagai 'Close Handle' pada sub-proses '\ BaseNamedObjects \ ValveHalfLifeLauncherMutex' atau sesuatu. tidak sesulit itu. buka di sini untuk petunjuk terperinci - http://am.half-lifecreations.com/forums/index.php?topic=479.0

Tapi ya itu untuk paruh waktu tetapi dapatkan Process Explorer dan saya yakin Anda akan dapat menemukan yang menangani / proses yang Anda harus tutup untuk mendapatkan program yang Anda inginkan berjalan berkali-kali.

Saya tidak mengerti mengapa windows tidak menerapkan menjalankan game berkali-kali dalam splits / snaps sebagai fitur! ini jelas karena orang tidak akan membeli PC sebanyak ... juga memeriksa SoftXSpand benar-benar hebat, memungkinkan Anda untuk menjalankan beberapa contoh windows sebagai pengguna independen

Tonton
sumber
Tutup gagang mutan bekerja untukku. Ini bukan paruh tetapi menggunakan mutex di sisi programmer cukup umum sehingga solusi ini agak generik.
AZ.
1

File kunci, pipa bernama, dan peristiwa sinkronisasi adalah beberapa cara umum yang digunakan aplikasi untuk memeriksa mereka satu-satunya contoh yang berjalan. Untuk mengatasi file-file kunci Anda harus memvirtualisasi sistem file, menghubungkannya atau menghapus secara waktu (dan mungkin tidak berfungsi jika mengunci file juga terbuka). Bernama pipa dan acara sinkronisasi akan jauh lebih sulit karena Anda tidak memiliki kontrol yang sama dari luar aplikasi yang Anda lakukan dengan file.

the_mandrill
sumber
0

Di Windows 8 dan yang lebih baru, Anda menahan tombol Shift dan mengklik ikon / tombol program pada taskbar. Ini akan meluncurkan executable lagi. Jika aplikasi tidak memeriksa sendiri klon, Anda akan memiliki jendela baru.

Ini tentunya akan berpotensi menimbulkan konflik dengan file internal aplikasi jika terbuka misalnya file internal sqlite, jadi Anda harus benar-benar tahu apa yang Anda lakukan atau tidak peduli jika ada yang rusak.

Costin Gușă
sumber