Интересный CreateProcess
Из сервиса запускаеться EXE с использованием функции CreateProcess - но запускаеться скрытым. Тот же самый код из обычного приложения запускает нормально все. Какких флагов не хватает?
[COLOR=darkblue]
STARTUPINFO start = {sizeof(TStartupInfo)};
PROCESS_INFORMATION procInfo;
LPCTSTR s;
start.cb = sizeof(start);
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = SW_SHOW;
CreateProcess(NULL, patch.c_str(), NULL,NULL,false,
NORMAL_PRIORITY_CLASS, NULL,NULL, &start,&procInfo);
[/COLOR]
Проблема такая
Из сервиса запускаеться EXE с использованием функции CreateProcess - но запускаеться скрытым. Тот же самый код из обычного приложения запускает нормально все. Какких флагов не хватает?
[COLOR=darkblue]
STARTUPINFO start = {sizeof(TStartupInfo)};
PROCESS_INFORMATION procInfo;
LPCTSTR s;
start.cb = sizeof(start);
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = SW_SHOW;
CreateProcess(NULL, patch.c_str(), NULL,NULL,false,
NORMAL_PRIORITY_CLASS, NULL,NULL, &start,&procInfo);
[/COLOR]
Я бы отчистил структуру STARTUPINFO перед заполнением:
ZeroMemory(&start, sizeof start);
start.cb = sizeof start;
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = SW_SHOW;
Кстати, для чего:
STARTUPINFO start = {sizeof(TStartupInfo)}; ?
Возможно, надо добавить флаг CREATE_NEW_PROCESS_GROUP в CreateProcess
Я бы отчистил структуру STARTUPINFO перед заполнением:
ZeroMemory(&start, sizeof start);
start.cb = sizeof start;
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = SW_SHOW;
Кстати, для чего:
STARTUPINFO start = {sizeof(TStartupInfo)}; ?
Возможно, надо добавить флаг CREATE_NEW_PROCESS_GROUP в CreateProcess
не работает.
По поводу
STARTUPINFO start = {sizeof(TStartupInfo)}; ?
Это я откудато скопировал просто
А вот с таким кодом тоже не работает
[COLOR=darkblue]
STARTUPINFO start;
ZeroMemory(&start, sizeof(STARTUPINFO));
PROCESS_INFORMATION procInfo;
LPCTSTR s;
start.cb = sizeof(STARTUPINFO);
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = SW_SHOW;
CreateProcess(NULL, patch.c_str(), NULL,NULL,false,
CREATE_NEW_PROCESS_GROUP, NULL,NULL, &start,&procInfo);
[/COLOR]
ДА вот еще парадокс
Есть у меня еще один сервис - так вот от туда все нормально работает
Ну в общем поборол я его (в смысле сервис)
Расказываю - мож кому пригодиться.
Если при проектировании сервиса в его свойсвах
не указать ServiceStartName=".\LocalSystem", то
после установки сервису будет запрещено взаимодействие с рабочим столом - отсюда и идет скрытый запус программ, так как непонятно где это программа была запущена - вот так.
Если это все же произошло - то нужно в свойствах сервиса поставить эту чертову галочку.
Ну в общем поборол я его (в смысле сервис)
Расказываю - мож кому пригодиться.
Если при проектировании сервиса в его свойсвах
не указать ServiceStartName=".\LocalSystem", то
после установки сервису будет запрещено взаимодействие с рабочим столом - отсюда и идет скрытый запус программ, так как непонятно где это программа была запущена - вот так.
Если это все же произошло - то нужно в свойствах сервиса поставить эту чертову галочку.
А как на счет параметра CreateProcess lpDesktop ?
В смысле передать хендел десктопа?
В структуре STARTUPINFO есть поле lpDesktop.
В нем передается имя десктопа, а не хендл.
Более конкретно здесь:
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q171/8/90.asp&NoWebContent=1
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q165/1/94.asp&NoWebContent=1
Если при проектировании сервиса в его свойсвах
не указать ServiceStartName=".\LocalSystem"
Подскажите пожалуйста, где именно это надо прописывать (а точнее при заполнении какой структуры или вызове какой функции)?