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

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

13.02.2014, 13:31. Показов 1522. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru