Процесс, кажется, заблокирован. Все потоки перестали работать

0

В моем приложении у меня есть одна служба, которая запускает один exe.

В служебном коде я запускаю exe командой ShellExecuteEx как:

BOOL bLaunched = false;



       SHELLEXECUTEINFO ex;
       memset(&ex, 0, sizeof(ex));
       ex.cbSize       = sizeof(ex);
       ex.fMask        = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
       ex.hwnd         = ::GetDesktopWindow();
       ex.lpVerb       = _T("open");
       ex.lpParameters = params;
       ex.lpDirectory  = path;
       ex.nShow        = SW_SHOWNORMAL;
       ex.lpFile       = appName;

       bLaunched = ShellExecuteEx(&ex);
       return bLaunched;

После вызова ShellExecuteEx я могу видеть, что exe в диспетчере задач, и когда я пытаюсь подключить этот exe к отладчику VS и разорвать его, он покажет мне сообщение "the process appears to be deadlocked(or is not running any user-mode code).All threads have been stopped"

Отладчик VS показывает зеленую стрелку, указывающую на первую строку в funciton winMain.

Это происходит только тогда, когда я пытаюсь запустить этот exe из службы. Когда я пытаюсь запустить этот exe из примера приложения с тем же набором параметров, он отлично работает.

Любое предложение, почему оно не работает в случае обслуживания.

Обновления: Я понял это. Я вызывал MessageBox в exe.I удалял MessageBox, и он выполнялся отлично. Это похоже на вызов связанных с Windows функций, вызвавших эту проблему. На самом деле сервис выполнялся в локальной учетной записи системы, а exe запускался с этой службы. Так что мы не можем вызывать функции окна из локальной системной учетной записи.

Еще одна проблема, с которой я столкнулся сейчас. В exe он не может открыть реестр для чтения значений. Я пытаюсь открыть HKCU, но это не удалось.

  • 1
    Как указано в справочнике MSDN , вы инициализировали COM? И вы не держите замок загрузчика ?
  • 0
    Я не уверен, что это может быть причиной, потому что я только что попытался использовать CreateProcess, и я вижу свой exe в TaskManager, но он снова находится в заблокированном состоянии
Показать ещё 3 комментария
Теги:
winapi
shellexecute
deadlock

1 ответ

1
Лучший ответ

Вы пытаетесь запустить исполняемый файл, который взаимодействует с рабочим столом. Сервисы запускаются в сеансе 0, который является неинтерактивным сеансом. Вам нужно убедиться, что все процессы, которые вы запускаете в этом сеансе, не взаимодействуют с рабочим столом.

В стороне, вы никогда не должны пропускать окно рабочего стола в качестве окна владельца: http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx.

  • 0
    Любая идея, почему этот exe не может открыть реестр. Я ожидаю, что служба, работающая в системной учетной записи, имеет права высокого уровня, и exe, запущенный службой, также должен иметь возможность делать все.
  • 0
    Процесс сможет открыть реестр, но какое значение вы ожидаете найти в HKCU для процесса, работающего как LocalSystem? Я предполагаю, что вы действительно хотите реестр для вошедшего в систему пользователя. Но это трудно найти по серверу, работающему как LocalSystem. Кстати, почему вы решили использовать LocalSystem? Вы не должны этого делать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню