VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1433|回复: 9

如何防止Delphi程序重复执行?

[复制链接]

2

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-15 03:00:01 | 显示全部楼层 |阅读模式
如何防止Delphi程序重复执行?
我网上搜了一下,很多种版本,不知道哪种好。我现在的程序是MDI窗口类型的,开始只有个登录窗口,登录信息验证通过后获取相应的权限显示主窗口及其菜单。
各位有没有实用的已经在用的成熟的方法?请赐教,谢谢了!
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-2-23 22:05:55 | 显示全部楼层
互斥!!!
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-4-19 15:15:01 | 显示全部楼层
"Project"->"View Source"

program Project1;

uses
  Windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  //防止程序多次运行
  CreateMutex(nil, false, PChar('标识程序的字符串'));
  if GetLastError = ERROR_ALREADY_EXISTS then
    exit;

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

注意声明Windows单元
回复

使用道具 举报

0

主题

53

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-5-2 12:30:01 | 显示全部楼层
CreateMutex(nil, false, 'Project_Client.exe');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    SendMessage(HWND_BROADCAST, RegisterWindowMessage('Project_Client.exe'), 0, 0);
    ShowMessage('程序已经运行!');
    Halt(0);
  end;
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-5-10 19:30:01 | 显示全部楼层
这些足够你用了吧,随便那个只要行就行了.
回复

使用道具 举报

2

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-6-3 12:30:02 | 显示全部楼层
谢谢各位,上面的问题是解决了,但是只出来提示信息,不能把已经最小化或者藏在其它窗口后面的应用程序呼叫出来,要怎么处理呢?谢谢了!
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-8 15:00:01 | 显示全部楼层
CreateMutex方法
===
在程序没有正常退出后,再运行会不会有问题?
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-13 12:15:02 | 显示全部楼层
防止同时出现多个应用程序实例之改进

//==============================================================================
// Unit Name: MultInst
// Purpose  : 解决应用程序多实例问题
// History  :
//==============================================================================

//==============================================================================
// 工作流程
// 程序运行先取代原有向所有消息处理过程,然后广播一个消息.
// 如果有其它实例运行,收到广播消息会回发消息给发送程序,并传回它自己的句柄
// 发送程序接收到此消息,激活收到消息的程序,然后关闭自己
//==============================================================================
unit MultInst;

interface

uses
  Windows ,Messages, SysUtils, Classes, Forms;

implementation

const
  STR_UNIQUE    = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
  MI_ACTIVEAPP  = 1;  //激活应用程序
  MI_GETHANDLE  = 2;  //取得句柄

var
  iMessageID    : Integer;
  OldWProc      : TFNWndProc;
  MutHandle     : THandle;
  BSMRecipients : DWORD;

function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
  Longint; stdcall;
begin
  Result := 0;
  if Msg = iMessageID then
  begin
    case wParam of
      MI_ACTIVEAPP: //激活应用程序
        if lParam<>0 then
        begin
          //收到消息的激活前一个实例
          //为什么要在另一个程序中激活?
          //因为在同一个进程中SetForegroundWindow并不能把窗体提到最前
          if IsIconic(lParam) then
            OpenIcon(lParam)
          else
            SetForegroundWindow(lParam);
          //终止本实例
          Application.Terminate;
        end;
      MI_GETHANDLE: //取得程序句柄
        begin
          PostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP,
            Application.Handle);
        end;
    end;
  end
  else
    Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;

procedure InitInstance;
begin
  //取代应用程序的消息处理
  OldWProc    := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
    Longint(@NewWndProc)));

  //打开互斥对象
  MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, STR_UNIQUE);
  if MutHandle = 0 then
  begin
    //建立互斥对象
    MutHandle := CreateMutex(nil, False, STR_UNIQUE);
  end
  else begin
    Application.ShowMainForm  :=  False;
    //已经有程序实例,广播消息取得实例句柄
    BSMRecipients := BSM_APPLICATIONS;
    BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
        @BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
  end;
end;

initialization
  //注册消息
  iMessageID  := RegisterWindowMessage(STR_UNIQUE);
  InitInstance;

finalization
  //还原消息处理过程
  if OldWProc <> Nil then
    SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));

  //关闭互斥对象
  if MutHandle <> 0 then CloseHandle(MutHandle);

end.



//使用方法很简单,只要把此单元加入工程就可以了.

回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-18 21:30:01 | 显示全部楼层
jedi库里好像有这么一个组件,拖到窗体上就可以。
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-19 23:45:01 | 显示全部楼层
你在别的程序的时候你
改一下
STR_UNIQUE    = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
就行了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表