Folks,
For everybody thats need to limit the instance number of your application:
| Delphi | | copy code | | ? |
| 01 | uses SysUtils, TLHelp32; |
| 02 | |
| 03 | function AppRunningCount(const AExeName: string): integer; |
| 04 | var |
| 05 | hSnap: THandle; |
| 06 | p32: TProcessEntry32; |
| 07 | begin |
| 08 | Result := 0; |
| 09 | hSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); |
| 10 | p32.dwSize := Sizeof(TProcessEntry32); |
| 11 | Process32First(hSnap, p32); |
| 12 | repeat |
| 13 | if SameText(AExeName, ExtractFileName(p32.szExeFile)) then |
| 14 | inc(Result); |
| 15 | until not Process32Next(hSnap, p32); |
| 16 | CloseHandle(hSnap); |
| 17 | end; |
Use:
| Delphi | | copy code | | ? |
| 1 | // On DPR |
| 2 | // Limit to 1 instance |
| 3 | begin |
| 4 | if AppRunningCount(ExtractFileName(ParamStr(0))) = 1 then |
| 5 | begin |
| 6 | // Application codes |
| 7 | end; |
| 8 | end. |
| 9 |
Explaining more about this approach:
In a situation of multiples logons at the same machine the Mutex cannot provide a correctly singleton structure because the mutex handle still only under the local scope of the user. So the way to control the instance number is counting the number of times the process appear on the process list of the machine.
Tags: AppRunningCount, CreateToolhelp32Snapshot, Delphi, Process32First, Process32Next, TH32CS_SNAPPROCESS, TProcessEntry32, Usefull Function
