Easiest way to find previous instance of an application

末鹿安然 提交于 2019-12-23 20:24:27

问题


I have rewritten a VB6 application in Delphi. It should have only one instance running. How can I do this with minimum of code?

In VB6 we just have to use one single line of code >

If App.PrevInstance Then 'Take some action End If

On goggling I did find a solution but it is very length and we have to mess with .drp file.

I do not want to do that.

I want something simpler.


回答1:


I have some code along the lines of:

var
    AppMutex: THandle;

{ .... }


initialization
    // Create the mutex
    AppMutex := CreateMutex(nil, True, 'MY-APPLICATION-NAME');
    if (AppMutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
    begin
        MessageDlg('My application is already running on this computer.'#13#10+
            'You should close the other instance before starting a new one.',mtError,
            [mbOK],0);
        Halt;
    end;

finalization
    // Close the mutex
    CloseHandle(AppMutex);

but I'm sure the answers in the thread that @mghie linked to are more helpful/richer features!

Edit: Note you can make this into a small unit in it's own right, then just use that unit in your project(s).




回答2:


Note that in many cases, the user's expecation will be that launching the second instance results in the first instance being restored and brought to the foreground. Don't expect users to understand the difference between restoring a minimized/hidden app and launching from a shortcut or start menu.




回答3:


In my experience one cannot decide in general wether an application my be started twice or not. It may be for instance perfectly valid to start the same application if it is started in another folder or under another user account or whatever. On the other hand it might be the case that two different applications may not run together if they are started in the same folder or so.

So besides the different approaches with mutexes and semaphores and handling race conditions, it is the wise selection of the mutex's or semaphore's name that handles the above combinations appropriately.

If an application may not run twice at all, take a GUID like name. You can even use the exe's filename if you can ignore that someone might rename it.

Restricting the one-time-start on a specific folder, you can take the exe path into account, but be aware that due to mappings different pathes may end up at the same exe.



来源:https://stackoverflow.com/questions/2432287/easiest-way-to-find-previous-instance-of-an-application

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!