Определить, работает ли экземпляр с kernel32 :: CreateMutexA - PullRequest
2 голосов
/ 06 января 2010

Я работаю над установщиком NSIS и пытаюсь проверить, запущено ли определенное приложение перед удалением. Итак, я использую kernel32::CreateMutexA звонок. Вот кусок:

System::Call 'kernel32::CreateMutexA(i 0, i 0, t "cmd.exe") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
    MessageBox MB_USERICON "The application is already running."
Abort

Я положил его в un.onInit. Проблема в том, что процесс (cmd.exe здесь) никогда не обнаруживается.

Я что-то пропустил?

Tx.

Ответы [ 4 ]

2 голосов
/ 28 января 2010

Я нашел простое решение; с помощью плагина FindProcDLL .

Итак:

FindProcDLL::FindProc "cmd.exe"
Pop $R0
StrCmp $R0 0 +3
 MessageBox MB_USERICON "The application is already running." IDOK
Abort

P.S. FindProcDLL.dll необходимо скопировать в /Plugins.

1 голос
/ 06 января 2010

Возможно, вы используете неправильную функцию Win32 API. Ваш CreateMutex пытается создать именованный мьютекс "thing.exe ". Если нет такого с таким именем, оно будет успешно выполнено, поэтому, если процесс, который вы пытаетесь проверить, не создает мьютекс с этим именем, вы не получите желаемый результат.

То, что вы хотите - это, вероятно, перечислить все запущенные процессы и посмотреть, есть ли тот, за которым вы работаете. Вы можете сделать это с помощью ToolHelp32 из Win32 API - см. пример здесь . Я не знаю, насколько легко будет преобразовать его в «чистый» NSIS, чтобы вы могли написать плагин DLL или проверить, существует ли уже существующее решение, распространяющееся вокруг сообщества NSIS.

1 голос
/ 06 января 2010

Все, что вы делаете, это создаете мьютекс с глобальным именем "cmd.exe". Из статьи MSDN для CreateMutex:

Если lpName соответствует имени существующего события, семафор, ожидаемый таймер, задание или объект отображения файла, функция завершается ошибкой и Функция GetLastError возвращает ERROR_INVALID_HANDLE. Это происходит потому что эти объекты имеют одинаковое пространство имен.

Таким образом, если cmd.exe не создаст дескриптор для одного из этих типов объектов с именем "cmd.exe", этот вызов просто создаст новый мьютекс с этим именем и вернет вам (не ошибочный) дескриптор.

0 голосов
/ 06 января 2010

Для такого рода вещей я использовал плагины KillProcess или Find-Close-Terminate для NSIS - см. здесь

Документация довольно проста, надеюсь, это сделает то, что вам нужно - с довольно минимальными накладными расходами.

...