Предположим, что какой-то автор ввел в свое приложение Windows единый экземпляр. Есть ли способ сделать несколько экземпляров этого приложения (кроме запуска внутри виртуальной машины или запроса автора переписать приложение)?
Если есть готовый инструмент, я бы хотел это знать. (Я пробовал песочницу и Altiris SVS без удачи).
Если там ничего нет, я хочу запрограммировать инструмент / хак, который позволит мне сделать это. Я ищу указатели с чего начать - что будет задействовано, какие навыки понадобятся. У меня умеренные навыки программирования на C и Java.
Если это невозможно, пожалуйста, объясните, почему.
РЕДАКТИРОВАТЬ: Я знаю, это плохая идея, но мне все еще нужно сделать это (по разным причинам). Я хочу общий способ, который работает для любого приложения и не вносит ошибок.
Ответы:
Многие приложения проверяют глобальный список процессов (с EnumProcesses, OpenProcess, GetModuleBaseName и аналогичных функций) или список окон (с EnumWindows, EnumChildWindows).
Вы можете попытаться установить перехват (см. Примеры SetWindowsHookEx, CallNextHookEx и т. Д.), Чтобы перехватывать эти конкретные вызовы функций API из этого приложения и заменять запрошенные данные в ответ вашими, чтобы обмануть приложение.
источник
Универсального способа не существует, потому что разные приложения используют разные методы. Многие из методов включают в себя попытку получить какой-то общесистемный (или, по крайней мере, общедоступный) ресурс (например, именованный объект синхронизации, файл с хорошо известным именем и местоположением или значение реестра). Если приложение выполнено успешно, оно удерживает этот ресурс до тех пор, пока оно выполняется. Если происходит сбой, потому что другой экземпляр уже содержит ресурс, он может попытаться сообщить исходному экземпляру, чтобы он мог ответить.
В 16-битной Windows, когда программа запускалась, ОС передавала ей уникальный дескриптор, называемый HINSTANCE. Также будет передано HINSTANCE текущего запущенного процесса, использующего тот же исполняемый файл (если есть). В те дни это был, пожалуй, самый распространенный способ для программы узнать, запущена ли уже копия. В 32-битной Windows с защищенной памятью, адресными пространствами, специфичными для процесса, и концом совместной многозадачности HINSTANCE больше не носили того же значения.
Небольшое количество приложений делают это просто для «удобства использования», но для многих других может быть веская причина для принудительного применения синглетонов. Обход этого может привести к повреждению данных или просто невозможности запуска.
источник
Вы можете запустить приложение на разных учетных записях пользователей, и проверка экземпляров больше не будет работать.
источник
Возможно!
Вот изображение, на котором я выполняю период полураспада 1 4x в 4 окнах, подключенных к одному и тому же серверу локальной сети, единственная проблема заключается в том, что контроллеры не связаны независимо с каждым окном.
Для этого вам понадобится Process Explorer - программа, которая позволяет вам выполнять то, что известно как «Закрыть дескриптор» в подпроцессе \ BaseNamedObjects \ ValveHalfLifeLauncherMutex или что-то в этом роде. это не так сложно. перейдите сюда для получения подробных инструкций - http://am.half-lifecreations.com/forums/index.php?topic=479.0
Но да, это для периода полураспада, но получите Process Explorer, и я уверен, что вы сможете найти, какой дескриптор / процесс вам нужно закрыть, чтобы запускать программы, которые вы хотите запускать несколько раз.
В любом случае, я не понимаю, почему Windows не реализует запуск игр несколько раз в режиме разделения / привязки! это очевидно, потому что люди не купили бы столько компьютеров ... также ознакомьтесь с SoftXSp и действительно потрясающим, позволяющим запускать несколько экземпляров окон в качестве независимых пользователей
источник
Файлы блокировки, именованные каналы и события синхронизации являются одними из распространенных способов, используемых приложениями для проверки того, что они являются единственным запущенным экземпляром. Чтобы обойти блокировку файлов, вам нужно либо виртуализировать файловую систему, подключиться к ней или выполнить тщательно синхронизированное удаление (и это может не сработать, если оно также заблокирует открытый файл). Именованные каналы и события синхронизации будут намного сложнее, потому что вы не имеете такого же контроля извне приложения, как с файлами.
источник
В Windows 8 и новее вы держите клавишу Shift и нажимаете значок / кнопку программы на панели задач. Это запустит исполняемый файл снова. Если приложение не выполняет самопроверку на наличие клонов, у вас появится новое окно.
Это, конечно, может привести к конфликтам с внутренними файлами приложения, если оно откроет, например, внутренний файл sqlite, поэтому вы должны действительно знать, что делаете, или вам все равно, что что-то сломается.
источник