运行任何Windows应用程序的多个实例


11

假设某些作者将他的Windows应用程序强制为单个实例。除了在虚拟机中运行或要求作者重写该应用程序之外,是否有其他方法可以创建该应用程序的多个实例?

如果有现成的工具,我想知道。(我尝试过Sandboxie和Altiris SVS却没有运气)。

如果没有东西,我想编写一个工具/黑客程序,让我做到这一点。我正在寻找从哪里开始的指针-将涉及什么,需要什么技能。我在C和Java方面具有中等的编程技能。

如果无法完成,请说明原因。

编辑:我知道这是一个坏主意,但我仍然需要这样做(由于各种原因)。我想要一种适用于任何应用程序且不会引入错误的通用方法。


3
Windows应用程序默认情况下不是单例。如果是这样,则意味着有人付出了额外的努力使它成为单例,并且可能有这样做的理由。
在计算机上2010年

1
取决于应用程序如何检查多个副本。各种应用程序以不同的方式进行检查,而某些应用程序将以多种方式进行检查。
2010年

正如In Silico所说,这可能不是一个好主意。如果您在不必要的情况下运行了多个副本,则该应用程序可能会破坏数据,崩溃或导致其他问题。
2010年

进程可以通过多种方式强制仅运行一个实例。我认为构建能够阻止这种情况的通用工具并不可行。您将必须单独检查每个应用程序并编写专门针对该应用程序的内容。

您找到解决方案了吗?
Tomas 2012年

Answers:


2

许多应用程序检查进程的全局列表(使用EnumProcesses,OpenProcess,GetModuleBaseName和类似的函数)或窗口列表(使用EnumWindows,EnumChildWindows)。

您可以尝试设置挂钩(请参见示例SetWindowsHookEx,CallNextHookEx等),以挂钩该应用程序中的那些特定API函数调用,并以您的请求替换请求的数据,以欺骗应用程序。


感谢所有的答案。我猜该工具需要一些仔细的设计。所设想的工具应该有点像一个非常轻量级的虚拟OS环境,它不涉及运行Windows的完整副本,但会使所有应用程序陷于瘫痪。
2010年

4

没有通用的方法,因为不同的应用程序使用不同的方法。许多方法涉及尝试获取机器范围(或至少用户范围)的某些资源(例如,命名的同步对象,具有众所周知的名称和位置的文件或注册表值)。如果应用程序成功运行,那么只要它运行,它就会保留该资源。如果由于另一个实例已经拥有资源而失败,则它可能会尝试向原始实例发出信号,以便它可以响应。

在16位Windows中,当程序启动时,操作系统向其传递了一个称为HINSTANCE的唯一句柄。它还将使用相同的可执行文件(如果有)传递给当前正在运行的进程的HINSTANCE。在那些日子里,这可能是程序知道副本是否已在运行的最常用方法。在具有受保护的内存,特定于进程的地址空间以及协作式多任务处理结束的32位Windows中,HINSTANCE不再具有相同的含义。

少数应用程序只是为了“可用性”而这样做,但是对于许多其他应用程序,可能有充分的理由实施单例。绕过那可能导致数据损坏或根本无法运行。


3

您可以在不同的用户帐户上运行应用程序,实例检查将不再起作用。


2

有可能的!

这是我在连接到同一LAN服务器的4个窗口中运行半衰期1 4x的图像,唯一的问题是控制器没有独立链接到每个窗口。

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

为此,您需要“流程浏览器”-一个程序,该程序可让您在“ \ BaseNamedObjects \ ValveHalfLifeLauncherMutex”子流程上执行“关闭句柄”之类的操作。它并不难。转到此处了解详细说明-http://am.half-lifecreations.com/forums/index.php?topic=479.0

是的,这是半衰期,但是可以使用Process Explorer,并且我确定您将能够找到需要关闭哪个句柄/进程才能多次获得要运行的程序。

我不明白为什么Windows始终无法在拆分/快照中多次实现运行游戏!显然是因为人们不会购买那么多的PC ...还可以查看SoftXSpand真棒,允许您以独立用户的身份运行Windows的多个实例


关闭一个突变体句柄对我有用。它不是半衰期,但是在程序员那边使用互斥锁是很常见的,因此这种解决方案是通用的。
AZ。

1

锁定文件,命名管道和同步事件是应用程序用来检查它们是否是唯一正在运行的实例的一些常用方法。要变通解决锁定文件,您要么必须虚拟化文件系统,要么将其挂接到系统中,或者进行仔细的定时删除(如果它也将文件锁定为打开状态,则可能无法正常工作)。命名管道和同步事件将更加困难,因为您无法从应用程序外部获得与使用文件相同的控件。


0

在Windows 8及更高版本中,按住Shift键并单击任务栏上的程序图标/按钮。这将再次启动可执行文件。如果该应用程序不自行检查克隆,您将拥有一个新窗口。

当然,如果打开了应用程序内部文件(例如,内部sqlite文件),这可能会与应用程序内部文件产生冲突,因此您必须真正知道自己在做什么,或者不在乎是否出现任何问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.