Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19

CreateProcess() запускает программу, но не показывает её главное окно.(

13.02.2014, 13:31. Показов 1461. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я пробую написать службу в Builder 5, а для её отладки создал простую пока пустую программку, такую Билдер деает по умолчанию. Сама по себе программка работает, но когда я запускаю службу, а служба через CreateProcess(...) запускает эту программку возникает проблема - программка запускается, но не показывает окно! Я уже и lspawn() пробовал - никакого толку... Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TSpawnProcStruct* CreateMonitoringProcess(){
    STARTUPINFO si;
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = 0;
    sa.bInheritHandle = false;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    TSpawnProcStruct *sps = new TSpawnProcStruct;
    Spawns->Add(sps);
    char handle[40];
    ltoa(ULONG(Application->Handle),handle,10);
    AStr path, s = ExtractFilePath(Application->ExeName);
    s = s.SubString(1, s.LastDelimiter("\\") - 1);
    s = s.SubString(1, s.LastDelimiter("\\") - 1);
    path = s + "\\" + MONITOR_DIR + MONITOR_EXE_FILE;
    SetMessage(" starting monitor: " + path, mt_info);
    CreateProcess(LPCTSTR(path.c_str()), LPTSTR(handle), &sa, &sa, false,
        CREATE_DEFAULT_ERROR_MODE | CREATE_SEPARATE_WOW_VDM, 0, 0, &si, &sps->pi);
    return sps;
}
Казалось бы ничего такого... и код вроде проверенный...

Добавлено через 3 минуты
Ах, да... вот недостающее описание TSpawnProcStruct:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//--------------------------------------------------------------------------------------------------
 
struct TSpawnProcStruct : public TObject{
    PROCESS_INFORMATION pi;
    TSpawnMsgFunc *spawn_func;
    TSpawnProcStruct();
    ~TSpawnProcStruct();
};
//--------------------------------------------------------------------------------------------------
 
TSpawnProcStruct::TSpawnProcStruct(){
    ZeroMemory(&pi, sizeof(pi));
    spawn_func = 0;
}                                     
 
TSpawnProcStruct::~TSpawnProcStruct(){
    if (pi.hProcess){
        TerminateProcess(pi.hProcess, 0);
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2014, 13:31
Ответы с готовыми решениями:

CreateProcess не запускает программу
Прочитал умную статью, что мол надо использовать исключительно CP для запуска сторонних процессов. Вот пытаюсь:procedure...

Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается только главное невидимое
Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается только главное невидимое)) ) и как можно...

Компилятор не запускает программу, открывая диалоговое окно записи макроса
Доброго времени суток! Заранее извиняюсь за, скорее всего, довольно глупый вопрос, однако в программировании я почти полный ноль и просто...

4
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.02.2014, 14:30
Лучший ответ Сообщение было отмечено ЯМалыш как решение

Решение

Цитата Сообщение от ЯМалыш Посмотреть сообщение
Сама по себе программка работает, но когда я запускаю службу, а служба через CreateProcess(...) запускает эту программку возникает проблема - программка запускается, но не показывает окно!
Служба запускается в отдельной оконной станции, а на Windows Vista и выше -
еще и в отдельной сессии. Пытаться из нее показывать какие-то окна нет смысла.
На системах до Windows Vista есть флаг SERVICE_INTERACTIVE_PROCESS, но я
его не советую, т.к. это работает только для первого залогиненного пользователя.
Правильно будет вынести всю GUI-шную часть в обычный процесс и запускать
его в контексте пользователя, например из автозапуска. А службу оставить для
исключительно фоновых неинтерактивных задач.
1
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
13.02.2014, 14:55  [ТС]
Понятно... Но как-то отлаживать службу надо...
Наверное действительно лучше держать программку запущенной всё время.
А после запуска службы находить эту программку в списке процессов и посылать в неё сообщения.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.02.2014, 15:01
Цитата Сообщение от ЯМалыш Посмотреть сообщение
Но как-то отлаживать службу надо.
Можно сделать так, чтобы в зависимости от параметров командной строки
программа запускалась либо как служба, либо как обычный консольный процесс.
Это довольно удобно для целей отладки, и менять особо ничего не нужно.
Еще есть вот такой способ:

How to: Launch the Debugger Automatically
http://msdn.microsoft.com/en-u... 90%29.aspx

Наверное действительно лучше держать программку запущенной всё время.
А после запуска службы находить эту программку в списке процессов и посылать в неё сообщения.
Должен предостеречь, что по причинам, описанным выше, оконные сообщения между
службой и обычным процессом не пройдут. Да и другие способы коммуникаций,
такие как каналы или отображаемые в память файлы, потребуют дополнительной
настройки безопасности (чтобы обычный процесс мог открывать объекты, созданные
системным процессом).
1
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
13.02.2014, 16:41  [ТС]
Спасибо большое!...
если не получится напрямую через сообщения, то буду через TCP/IP... закину в службу и в программку сокеты (TServerSocket/TClientSocket) перебрасывать сообщения...

Добавлено через 1 минуту
Я раньше никогда не писал службы... Но всё когда-то бывает в первый раз...)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2014, 16:41
Помогаю со студенческими работами здесь

Закрыть дочернее окно и открыть в единственном экземпляре Главное окно
Есть главная форма Main Form , там кнопка Button 1 при нажатии на Button 1 открывыется дочерняя форма Form 1, на фомрме Form 1 есть кнопка...

Создать окно поверх главного окна, чтобы главное окно было доступно
здравствуйте. подскажите пожалуйста как сделать окно поверх главного окна, но чтобы главное окно было доступно, как в word окно...

Chrome самостоятельно запускает себя и показывает рекламу
В общем человек на ПК загрузил что то уже не помнит или не хочет говорить и как Вы все понимаете появилась зараза в хроме, каждые 30-45 мин...

Как скрыть окно createprocess
вопрос заключается непосредственно в название темы пробовал так: var SI: TStartupInfo; begin SI.wShowWindow:= 0; ...

Главное окно неперерисовывается
Перепробывал кучу вариантов, ничего не помогает(Я новичок в программировании).#include <windows.h> LRESULT CALLBACK control (HWND...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru