如何检测在另一个工作站上运行的同一Win32应用程序的另一个实例?

时间:2009-02-14 18:43:29

标签: winapi copy-protection

我有一个小应用程序,可以免费供个人使用,但需要付费许可才能供公司使用。

最有可能的是,在企业环境中,我的应用程序将在多个工作站上运行。如果它是免费软件版本,我想展示一个不引人注目的消息。 (并继续)

它不一定是防弹的,如果不可能(即防火墙)那么应用程序应该继续。而且我不想让用户设置某种中央服务来跟踪实例。我不想惹恼我的用户(尤其不是付费用户* g *)

有没有办法实现这种功能?

我记得较旧版本的Dreamweaver有这种功能。您无法在同一网络中多次运行它。

4 个答案:

答案 0 :(得分:4)

一种方法:在特定端口上侦听UDP广播。让每个实例在此端口上将广播UDP数据包发送到本地网络。如果应用程序收到此类数据包并识别其结构,则它知道其他实例正在运行。

如果使用了两个有效的许可证,您可以包含许可证详细信息以避免消息。

广播通常不会路由,因此仅适用于本地网络。 (并且用户也可以通过防火墙完全禁用它......但是如果您使用某些标准端口,如53(DNS),它将不会被阻止)。

其他方式是使用自定义服务器,该服务器通知全世界所有正在运行的实例; - )

答案 1 :(得分:3)

有两种主要方法可以实现这一目标:

首先,您可以在每个工作站上设置一个与网络上其他工作站通信的小型服务器应用程序(我个人会使用Bonjour进行发现,但还有其他选项)。这里的缺点是你要编写相当多的代码来完成这项工作而不是选项#2。

第二个(可能更简单)是使用WMI枚举其他工作站上的进程(同样,可能使用类似Bonjour的系统进行发现),并找到在其他计算机上运行的进程。这样做的缺点是,您的枚举代码将需要所有计算机上的权限才能进行搜索。

答案 2 :(得分:3)

当应用程序启动时,它会在特定端口上发送UDP广播。这将限制在本地子网中,并且可能无法通过防火墙。这是“其他人在跑,还是我可以开始?”查询。

如果没有响应,则应用程序正常启动,侦听此UDP广播。如果它看到一个,它会响应“我已经在运行;你无法启动”数据包。

刚刚启动的应用程序收到此响应数据包,然后拒绝启动或(如果您不想那么严格)向用户显示警告。

您希望在初始请求中包含产品ID和许可证密钥(或哈希),以便您可以在同一网络上拥有多个许可证。响应可能需要其中的机器名称,以便第二个用户可以找到第一个用户并询问他们是否确实需要使用该应用程序。

答案 3 :(得分:0)

邪恶的公司解决方案:
每次启动时都让应用程序回家。如果许可证的多个申请被唤醒,请告诉它不要。如果没有互联网连接,请不要启动。