Запустить несколько экземпляров любого приложения Windows

11

Предположим, что какой-то автор ввел в свое приложение Windows единый экземпляр. Есть ли способ сделать несколько экземпляров этого приложения (кроме запуска внутри виртуальной машины или запроса автора переписать приложение)?

Если есть готовый инструмент, я бы хотел это знать. (Я пробовал песочницу и Altiris SVS без удачи).

Если там ничего нет, я хочу запрограммировать инструмент / хак, который позволит мне сделать это. Я ищу указатели с чего начать - что будет задействовано, какие навыки понадобятся. У меня умеренные навыки программирования на C и Java.

Если это невозможно, пожалуйста, объясните, почему.

РЕДАКТИРОВАТЬ: Я знаю, это плохая идея, но мне все еще нужно сделать это (по разным причинам). Я хочу общий способ, который работает для любого приложения и не вносит ошибок.

Jus12
источник
3
Приложения Windows не являются синглетонами по умолчанию. Если это так, это означает, что кто-то приложил дополнительные усилия, чтобы сделать его одиночным, и, вероятно, имеет для этого причину.
In silico
1
Зависит от того, как приложение проверяет наличие нескольких копий. Различные приложения проверяют по-разному, а некоторые приложения проверяют несколькими способами.
ho1
Как говорит В Силико, это, вероятно, не очень хорошая идея. Приложение может повредить данные, вызвать сбой или вызвать другие проблемы, если у вас запущено несколько копий, когда они не предназначены.
ho1
Есть много способов, которыми процесс может принудительно запустить только один экземпляр; Я не думаю, что возможно создать универсальный инструмент, способный предотвратить это. Вы должны изучить каждое приложение в отдельности и написать что-то специально для него.
Вы нашли решение?
Томас

Ответы:

2

Многие приложения проверяют глобальный список процессов (с EnumProcesses, OpenProcess, GetModuleBaseName и аналогичных функций) или список окон (с EnumWindows, EnumChildWindows).

Вы можете попытаться установить перехват (см. Примеры SetWindowsHookEx, CallNextHookEx и т. Д.), Чтобы перехватывать эти конкретные вызовы функций API из этого приложения и заменять запрошенные данные в ответ вашими, чтобы обмануть приложение.


источник
Спасибо за ответы на все вопросы. Я предполагаю, что инструмент нуждается в некотором тщательном дизайне. Предполагаемый инструмент должен быть чем-то похожим на очень легкую виртуальную среду ОС, которая не требует запуска полной копии окон, но обманывает все приложения.
Jus12
4

Универсального способа не существует, потому что разные приложения используют разные методы. Многие из методов включают в себя попытку получить какой-то общесистемный (или, по крайней мере, общедоступный) ресурс (например, именованный объект синхронизации, файл с хорошо известным именем и местоположением или значение реестра). Если приложение выполнено успешно, оно удерживает этот ресурс до тех пор, пока оно выполняется. Если происходит сбой, потому что другой экземпляр уже содержит ресурс, он может попытаться сообщить исходному экземпляру, чтобы он мог ответить.

В 16-битной Windows, когда программа запускалась, ОС передавала ей уникальный дескриптор, называемый HINSTANCE. Также будет передано HINSTANCE текущего запущенного процесса, использующего тот же исполняемый файл (если есть). В те дни это был, пожалуй, самый распространенный способ для программы узнать, запущена ли уже копия. В 32-битной Windows с защищенной памятью, адресными пространствами, специфичными для процесса, и концом совместной многозадачности HINSTANCE больше не носили того же значения.

Небольшое количество приложений делают это просто для «удобства использования», но для многих других может быть веская причина для принудительного применения синглетонов. Обход этого может привести к повреждению данных или просто невозможности запуска.

Адриан Маккарти
источник
3

Вы можете запустить приложение на разных учетных записях пользователей, и проверка экземпляров больше не будет работать.

Tomas
источник
2

Возможно!

Вот изображение, на котором я выполняю период полураспада 1 4x в 4 окнах, подключенных к одному и тому же серверу локальной сети, единственная проблема заключается в том, что контроллеры не связаны независимо с каждым окном.

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

Для этого вам понадобится Process Explorer - программа, которая позволяет вам выполнять то, что известно как «Закрыть дескриптор» в подпроцессе \ BaseNamedObjects \ ValveHalfLifeLauncherMutex или что-то в этом роде. это не так сложно. перейдите сюда для получения подробных инструкций - http://am.half-lifecreations.com/forums/index.php?topic=479.0

Но да, это для периода полураспада, но получите Process Explorer, и я уверен, что вы сможете найти, какой дескриптор / процесс вам нужно закрыть, чтобы запускать программы, которые вы хотите запускать несколько раз.

В любом случае, я не понимаю, почему Windows не реализует запуск игр несколько раз в режиме разделения / привязки! это очевидно, потому что люди не купили бы столько компьютеров ... также ознакомьтесь с SoftXSp и действительно потрясающим, позволяющим запускать несколько экземпляров окон в качестве независимых пользователей

Tonton
источник
Закрыть мутантную ручку у меня работает. Это не период полураспада, но использование мьютекса на стороне программиста довольно распространено, так что это решение является общим.
А-Я.
1

Файлы блокировки, именованные каналы и события синхронизации являются одними из распространенных способов, используемых приложениями для проверки того, что они являются единственным запущенным экземпляром. Чтобы обойти блокировку файлов, вам нужно либо виртуализировать файловую систему, подключиться к ней или выполнить тщательно синхронизированное удаление (и это может не сработать, если оно также заблокирует открытый файл). Именованные каналы и события синхронизации будут намного сложнее, потому что вы не имеете такого же контроля извне приложения, как с файлами.

the_mandrill
источник
0

В Windows 8 и новее вы держите клавишу Shift и нажимаете значок / кнопку программы на панели задач. Это запустит исполняемый файл снова. Если приложение не выполняет самопроверку на наличие клонов, у вас появится новое окно.

Это, конечно, может привести к конфликтам с внутренними файлами приложения, если оно откроет, например, внутренний файл sqlite, поэтому вы должны действительно знать, что делаете, или вам все равно, что что-то сломается.

Костин Гуцэ
источник