Самый простой способ найти предыдущий экземпляр приложения - PullRequest
3 голосов
/ 12 марта 2010

Я переписал приложение VB6 в Delphi. Должен быть запущен только один экземпляр. Как я могу сделать это с минимумом кода?

В VB6 мы просто должны использовать одну строку кода >

Если App.PrevInstance «Примите меры Конец, если

В отношении очков я нашел решение, но оно очень длинное, и нам нужно связываться с файлом .drp.

Я не хочу этого делать.

Я хочу что-то попроще.

Ответы [ 3 ]

3 голосов
/ 12 марта 2010

Обратите внимание, что во многих случаях пользователь ожидает, что при запуске второго экземпляра первый экземпляр будет восстановлен и выведен на передний план. Не ожидайте, что пользователи поймут разницу между восстановлением свернутого / скрытого приложения и запуском из контекстного меню или меню «Пуск».

3 голосов
/ 12 марта 2010

У меня есть какой-то код:

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);

но я уверен, что ответы в теме, на которые ссылается @mghie, являются более полезными / более богатыми функциями!

Редактировать: обратите внимание, что вы можете сделать это в небольшой блок самостоятельно, а затем просто использовать этот блок в вашем проекте (ах).

1 голос
/ 12 марта 2010

По моему опыту, нельзя вообще решить, будет ли приложение запускаться дважды или нет. Например, может быть вполне допустимым запускать одно и то же приложение, если оно запущено в другой папке или под другой учетной записью пользователя или чем-то еще. С другой стороны, может случиться так, что два разных приложения могут не работать вместе, если они запущены в одной папке или около того.

Таким образом, помимо различных подходов с мьютексами и семафорами и обработкой условий гонки, это мудрый выбор имени мьютекса или семафора, который соответствующим образом обрабатывает вышеуказанные комбинации.

Если приложение может вообще не запускаться дважды, возьмите GUID как имя. Вы даже можете использовать имя файла exe, если можете игнорировать, что кто-то может его переименовать.

Ограничив одноразовый запуск для определенной папки, вы можете принять во внимание путь к exe, но имейте в виду, что из-за сопоставлений разные пути могут оказаться в одном и том же exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...