Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何确保我的应用程序只运行一个实例?_Delphi_Delphi Xe - Fatal编程技术网

Delphi 如何确保我的应用程序只运行一个实例?

Delphi 如何确保我的应用程序只运行一个实例?,delphi,delphi-xe,Delphi,Delphi Xe,Delphi XE VCL中是否支持确保仅运行一个应用程序实例 在过去,我使用库代码来控制一个看起来总是很复杂的互斥体。当我在Delphi XE中开始一个新项目时,我想知道是否需要挖掘旧代码,或者XE中是否已经内置了支持?或者是否还有另一种易于应用的代码,既美观又现代?启动应用程序时,您会创建一个命名的互斥体。检查GetLastError,查看是否有其他实例正在运行 将此代码放在DPR文件的“开始”之后。将GUID替换为您自己的GUID。当我需要一个不太可能用于其他任何内容的文本常量时,我通常只

Delphi XE VCL中是否支持确保仅运行一个应用程序实例


在过去,我使用库代码来控制一个看起来总是很复杂的互斥体。当我在Delphi XE中开始一个新项目时,我想知道是否需要挖掘旧代码,或者XE中是否已经内置了支持?或者是否还有另一种易于应用的代码,既美观又现代?

启动应用程序时,您会创建一个命名的互斥体。检查
GetLastError
,查看是否有其他实例正在运行

将此代码放在DPR文件的“开始”之后。将GUID替换为您自己的GUID。当我需要一个不太可能用于其他任何内容的文本常量时,我通常只需按Ctrl+G键即可获得GUID

if CreateMutex(nil, True, '6EACD0BF-F3E0-44D9-91E7-47467B5A2B6A') = 0 then
  RaiseLastOSError;

if GetLastError = ERROR_ALREADY_EXISTS then
  Exit;
代码可能正在泄漏句柄,因为它没有保存
CreateMutex
的返回。不是。当我们的应用程序终止时,Windows将自动释放句柄,这对我们来说是绝对正确的。

我使用JCL来实现这一点:

program MyProgram;

uses
  JclAppInst;

begin
  JclAppInstances.CheckSingleInstance; // Added instance checking
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

这方面的文档和通知方案位于。

您不需要对两行Windows API提供特定的
Delphi XE
支持。确保将
Windows
SysUtils
添加到DPR的uses子句中。这将在会话命名空间中创建互斥体。不同会话中的进程(快速用户切换)将能够在另一个会话中的进程运行时启动新进程。您可以使用Global\作为名称的前缀,以获取全局命名空间中的互斥。这一点很好。然而,这种行为(会话名称空间)可能正是一些开发人员真正想要的,尽管他们还没有考虑到这一点。假设您想要部署一个可以使用Windows终端服务运行的富数据库客户端应用程序,您可以为每个桌面部署一个应用程序,而不是为每台计算机部署一个应用程序。更简单的例子是:假设您为下一个大型聊天程序实现了这个应用程序;妻子来到电脑前,实际上是在“切换用户”(我妻子是这样做的!),并登录到她的帐户,试图启动下一个大型聊天程序。哎呀!无论如何,David,大家都应该阅读文档。+1用于直接访问VCL和Win API,而不是JCL。JCL没有问题,但是为什么在不需要的时候使用外部工具呢?我们在我们的商店中使用此解决方案多年,没有出现任何问题。对于不同的用户,正如您所提到的,通常这就是您想要的-不同的用户应该获得不同的会话/实例。是什么让您认为创建互斥锁不是现代的?我已经为以下类型实现了实例,它可以跨多个用户会话工作:TEAppSingleInstance=(siYes,SimultipleAcrossures,siNo)。是表示所有用户都有一个实例,否表示每个用户可以运行多个实例,多个跨用户表示每个用户只能为其会话运行一个实例,但多个用户可以同时运行应用程序。使用JCL时可能会重复+1。它经过测试,有一天甚至可以移植到不同的平台上。谢谢-这也有通知。不是在VCL中,而是次好的东西。