【温故Delphi】Win32API之CreateMutex

解决问题

  如何让一个软件在一台机器上只能运行一个实例呢?这个问题用专业术语就是进程互斥。这个问题可以通过CreateMutex来解决。

  进程互斥的核心思想:进程在启动时首先检查是否存在此进程实例,如果没有则创建进程并设置进程实例已存在的标记

  CreateMutex用于创建一个互斥体;

  OpenMutex为现有的一个已命名互斥体对象创建一个新句柄;

  ReleaseMutex释放由线程拥有的一个互斥体的控制权。

  具体实现代码如下:  

 1 constructor TUniqueAppInstance.Create(AUniqueAppStr: string);
 2 begin
 3   inherited Create;
 5   FMutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, PChar(AUniqueAppStr));
 6   // 互斥对象已建立,说明已有实例存在
 7   if FMutHandle <> 0 then
 8     raise Exception.Create(‘当前应用程序已经运行‘)
 9   else
10     FMutHandle := CreateMutex(nil, False, PChar(AUniqueAppStr));
11 end;

API说明

  HANDLE CreateMutex(

    LPSECURITY_ATTRIBUTES  lpMutexAttributes,   // 指向安全属性的指针
    BOOL  bInitialOwner,   // 初始化互斥对象的所有者
    LPCTSTR  lpName   // 指向互斥对象名的指针
  );

  

  

【温故Delphi】Win32API之CreateMutex,布布扣,bubuko.com

时间: 2024-10-07 06:29:58

【温故Delphi】Win32API之CreateMutex的相关文章

【温故Delphi】Win32API之GetTempFileName

所遇问题 新建的算量工程文件暂时保存到临时文件中,代码中调用了Win32 API——GetTempFileName 但在一台笔记本上,函数返回了一个空字符串! 为了查明原因想到了好用的GetLastError——返回错误信息. 结果错误信息为“拒绝访问”,这让我很快想到了传入文件夹用户权限问题. 经过检验,果然当前用户没有传入文件夹的写权限. 1 function GetTempFileA(const APrefix: string; const APath: string): string;

【温故Delphi】GAEA用到Win32 API目录

Delphi是Windows平台下著名的快速应用程序开发工具,它在VCL中封装并使用了大量的Win32 API. GAEA基于VCL开发的工具类产品,在程序中使用了大量的Win32 API,将经常用到或涉及到的API罗列并梳理一下. 系统API 1.事件对像:CreateEvent.setevent.ResetEvent和WaitForSingleObject: 2.互斥体:CreateMutex,OpenMutex和ReleaseMutex 3.时间:GetTickCount,Sleep,Ge

【温故Delphi】双击工程文件打开软件

问题描述 大部分软件都有鼠标双击文件,就能打开所关联的软件并打开所选工程,这是如何做到的呢? 把文件关联到一个程序中,双击文件来启动程序,那么这个文件名称就是这个程序的命令行的一个参数. 所以要想实现双击工程文件打开软件,在程序运行入口必须要处理命令行. 代码说明 1 begin 2 Application.Initialize; 3 CreateMainForm(); 4 //GetCommandLine为Win32 API,用于获取命令行内容 5 HandleCommandLine(GetC

【温故Delphi】之VCL消息机制小结

TObject消息分派 procedure Dispatch(var Message); virtual; #负责分派消息到特定VCL组件的事件处理函数 procedure DefaultHandler(var Message); virtual; #消息分类:通过子类覆盖此方法,处理窗口命令消息,窗口标准消息,VCL自行触发消息,VCL通知消息,自定义 VCL封装类的方法种类 procedure WMButtonUp(var Message: TWMButtonUp); message WM_

Delphi CreateMutex 防止程序多次运行

windows是个多用户多任务的操作系统,支持多个程序同时运行,如果你的程序不想让用户同时运行一个以上, 那应该怎样做呢? 本文将介绍避免用户同时运行多个程序的例子. 需要用到的函数CreateMutex ,CreateMutex 函数是windows中一个并不常用的函数, 该函数对象在系统中只能存在一个实例且是互斥体,所以利用这种特性就很简单的实现了我们的要求. [函数原声明]: function CreateMutex(lpMutexAttributes: PSecurityAttribut

学习笔记:delphi多线程知识

最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: 1.临界区 申明一个临界资源 FLock   : TRTLCriticalSection; 先初化一个临界资源对象InitializeCriticalSection(FLock)销毁临界资源对象DeleteCriticalSection(FLock) procedure TSaveThread.Pu

[转]Delphi中,让程序只运行一次的方法

program onlyRunOne; uses Forms,Windows,SysUtils, Dialogs, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var myMutex:HWND; begin myMutex:=CreateMutex(nil,false,'11111'); //名称只能全系统唯一. if WaitForSingleObject(myMutex,0)<>wait_TimeOut then begin Application.I

delphi 多线程2

多线程常用的内核对象:CreateEvent事件,CreateMutex互斥,CreateSemaphore信号,CreateWaitableTimer计时器 {建立事件} function CreateEvent( lpEventAttributes: PSecurityAttributes; {!} bManualReset: BOOL; bInitialState: BOOL; lpName: PWideChar ): THandle; stdcall; {建立互斥} function C

DELPHI下API简述(1800个API)

DELPHI下API简述 http://zero.cnbct.org/show.asp?id=144 auxGetDevCaps API 获取附属设备容量 auxGetNumDevs API 返回附属设备数量 auxGetVolume API 获取当前卷设置 auxOutMessage API 向输出设备发送消息 auxSetVolume API 设置附属设备卷 AbortDoc API 终止一项打印作业 AbortPath API 终止或取消DC中的一切路径 AbortPrinter API