2010-01-06 2 views
2

Я работаю над установщиком NSIS и пытаюсь проверить, запущено ли какое-либо приложение перед деинсталляцией. Итак, я использую вызов kernel32::CreateMutexA. Вот фрагмент:Обнаружить, если экземпляр запущен с 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.

+0

Любое количество экземпляров cmd.exe может работать в системе по нескольким причинам. – Anders

+0

Собственно, 'cmd.exe' был всего лишь примером. – Anonymous

ответ

2

Я нашел простое решение; используя FindProcDLL plugin.

Итак:

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.

+0

Это не работает с NSIS 2.46, как это также описано на странице. – Rex

1

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

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

Таким образом, если cmd.exe не создает дескриптор к одному из этих типов объектов с именем "cmd.exe", этот вызов будет просто создать новый семафор с таким именем и вернуть Вам (не erronous) рукоятку.

1

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

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

+0

Tx Idan. Странно. Когда я пытаюсь с самим установщиком (например, 'my_setup.exe'), он работает! Но не с другим процессом. – Anonymous

+0

Что работает? из вашего примера кода появится сообщение, если CreateMutexA преуспел - то есть, нет именованного мьютекса с указанным вами именем. , независимо от поведения, которое вы получаете, это неправильное решение проблемы, которую вы пытаетесь решить. –

+0

'CreateMutexA()' успешно выполняется с самим установщиком. Таким образом, на самом деле это правильное решение для обнаружения, есть ли запущенный экземпляр установщика. Но, как вы сказали, не хороший для любого другого процесса. – Anonymous

0

Для такого рода вещи, я использовал либо KillProcess или Найти приближающий Прекратить плагинов для NSIS - см here

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

Смежные вопросы