Запуск программы и передача ей управления
От: lsv  
Дата: 15.02.18 14:04
Оценка:
У меня в программе ААА.ехе есть 2 кнопки, одна открывает файл ВВВ.pdf, вторая запускает программу ССС.ехе и закрывает программу ААА.ехе.
Ситуация: если в начале была нажата кнопка запуска файла ВВВ.pdf, то после этого, нажатие второй кнопки запускает программу ССС.ехе, но она открывается в фоне под всеми программами и после закрытия программы ААА.ехе управление передается другой программе, а не нашей.
Образец кода запуска программы:
void __fastcall TMainForm::Button2Click(TObject *Sender)
{
ShellExecute(NULL, NULL, "ССС.exe", NULL, "", SW_SHOWNORMAL);
Close();
}
Возникает вопрос, как правильно запустить программу ССС.exe и передать ей управление?
Re: Запуск программы и передача ей управления
От: Maniacal Россия  
Дата: 15.02.18 14:29
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Возникает вопрос, как правильно запустить программу ССС.exe и передать ей управление?

Если я правильно понял, то нужно запустить программу CCC.exe в фоне и передать управление только после завершения AAA.exe? Если обе программы с исходниками, то нужно создать именованный мьютекс или семафор, залочить его в AAA.exe и ожидать в CCC.exe. Если CCC.exe сторонняя утилита, то первое, что приходит в голову — запускать CCC.exe в режиме SUSPENDED (понадобится CreateProcess вместо ShellExecute), потом CreateRemoteThread + первый сценарий с мьютексом/семафором и вызовом ResumeThread во внедряемом коде.
Только придётся сначала свой код внедрить в чужой процесс с помощью хука и специально созданной DLL. Можно даже одной командой и поток создать и библиотеку загрузить, в сети есть примеры (DLL Injection). Можно и более низкоуровнево, безо всяких библиотек, путём записи машинного кода в память другого процесса. Вместо мьютексов можно ещё WaitForSingleObject сделать на HANDLE процесса, который предварительно нужно получить через OpenProcess для AAA.exe
Отредактировано 15.02.2018 14:31 Maniacal . Предыдущая версия .
Re: Запуск программы и передача ей управления
От: VladFein США  
Дата: 15.02.18 18:28
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>У меня в программе ААА.ехе есть 2 кнопки, одна открывает файл ВВВ.pdf, вторая запускает программу ССС.ехе и закрывает программу ААА.ехе.

lsv>Ситуация: если в начале была нажата кнопка запуска файла ВВВ.pdf, то после этого, нажатие второй кнопки запускает программу ССС.ехе, но она открывается в фоне под всеми программами и после закрытия программы ААА.ехе управление передается другой программе, а не нашей.
lsv>Образец кода запуска программы:
lsv>void __fastcall TMainForm::Button2Click(TObject *Sender)
lsv>{
lsv> ShellExecute(NULL, NULL, "ССС.exe", NULL, "", SW_SHOWNORMAL);
lsv> Close();
lsv>}
lsv>Возникает вопрос, как правильно запустить программу ССС.exe и передать ей управление?

А при чём здесь ВВВ.pdf? Или Вы его тоже открываете через ShellExecute, каким-нибудь Adobe?

Я бы запускал ССС.ехе с помощью CreateProcess; таким образом ССС.ехе наследует привилегии на SetForegroundWindow.
Re[2]: Запуск программы и передача ей управления
От: lsv  
Дата: 16.02.18 06:57
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Если я правильно понял, то нужно запустить программу CCC.exe в фоне и передать управление только после завершения AAA.exe?


Не совсем в фоне, просто одна программа должна запустить другую, а сама закрыться, т.е. с точки зрения пользователя, он нажимает кнопку, допустим с названием "Продолжить работу в ССС", у него запускается CCC.exe и он продолжает работать в ней, но иногда программа CCC.exe запускается где-то в фоне и фокус передается не ей, а другому приложению.


Здравствуйте, VladFein, Вы писали:

VF>А при чём здесь ВВВ.pdf? Или Вы его тоже открываете через ShellExecute, каким-нибудь Adobe?


Pdf-файл тут как, просто в программе есть кнопка открытия какого-нибудь файла, pdf, doc, любой, назовем ее "Прочитать инструкцию", и да он так же открывается через ShellExecute.
Дело в том что, как я описывал выше, мне нужно закрыть первую программу и продолжить работать в другой, но если я из программы AAA запущу какой-нибудь документ, то после этого программа ССС откроется в фоне и управление потом передастся какой-нибудь левой программе, что жутко бесит пользователей.
Re[3]: Запуск программы и передача ей управления
От: Maniacal Россия  
Дата: 16.02.18 09:11
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Не совсем в фоне, просто одна программа должна запустить другую, а сама закрыться, т.е. с точки зрения пользователя, он нажимает кнопку, допустим с названием "Продолжить работу в ССС", у него запускается CCC.exe и он продолжает работать в ней, но иногда программа CCC.exe запускается где-то в фоне и фокус передается не ей, а другому приложению.


Т.е. проблема в том, что программе фокус не передаётся? В общем, проблема воспроизводится, если открывать документ BBB.pdf, потом запускать CCC.exe, в случае если CCC.exe успевает запуститься раньше, потом открывается документ BBB.pdf и фокус переключается на него. Тут даже не знаю что поделать, кроме костылей в виде того, что AAA.exe просто будет закрывать своё окно и некоторое время следить за фокусом окна CCC.exe, делая его активным, в случае чего, а потом потихоньку завершать свою работу через N секунд.
P.S. Именно с pdf не прокатывает, Adobe Reader сначала открывает своё окно, потом возвращает выполнение функции ShellExecute и только потом начинает свой документ открывать. А вот с вордовым документом получается, т.к. Word сначала показывает splash-screen и возвращает управление ShellExecute, а после открытия документа делает своё окно активным.
P.P.S. Пытался четвёртый параметр ShellExecute задавать NULL, как указано в примере, приложение виснет насмерть. Прокатывает только "".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.