Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Как запустить екзешник из другой программы?

28.10.2014, 19:37. Показов 2801. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята подскажите как можно лучше сделать такую задачу. У меня есть 2 екхешника оба делал я сам. Один екзешник это одно консольное окно, другой екзешник там формы с библиотекой vcl . Вообщем мне надо сделать так чтобы екзешник с консольным окном открывал другой екзешник. Для того чтобы второй екхешник с vcl не запускался двойным кликом, а запускался только сугубо консольным екзешником. Я сделал проверку на двойной клик таким образом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
__fastcall TProgress::TProgress(TComponent* Owner) : TForm(Owner)
{
 
    
       if (!FindWindow("ConsoleWindowClass","Consol"))
       {
                       ShowMessage("Открой меня консольным окном");
         Application->Terminate();
       }
             else
              {
                  ShowMessage("Запускаюсь");
              }
Консольное окно описано так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int _tmain(int argc, _TCHAR* argv[])
{
 SetConsoleTitle(L"Consol");
 UnicodeString rtyu = ExtractFilePath(Application->ExeName) + L"бла-бла.exe";
        if(FileExists(rtyu))
       {
         PROCESS_INFORMATION pi = {0};
         STARTUPINFOW si = {0};
         si.cb = sizeof(STARTUPINFO);
         if (CreateProcessWithLogonW(L"User1", NULL, L"1", 0,rtyu.w_str(),NULL, 0, NULL, NULL, &si, &pi)==false)
        {
           ShowMessage(SysErrorMessage(GetLastError()));
        }
        else
        { 
                         ShowMessage("Запуск");
                       }  
 
                }
     Sleep(1000);
     return 0;
}
Так вот этот код работает, но почему-то vcl-екзешник не всегда находит консольное окно, то есть FindWindow не находит консоль. Может быть это связано что 1 секунды мало, чтобы консоль задержался, но мне не хочется чтобы консольное окно висело очень долго пока его найдёт FindWindow. Может есть каки-нить другие методы решение этой проблемы.

Заранее благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2014, 19:37
Ответы с готовыми решениями:

Размер программы.Екзешник
Доброго времени суток. Народ, кто знает, как сделать, чтобы размер написанной в буилдере с++ проги был всегда одинаковым? Если на одном...

запустить .exe из другой программы win32
Заинтересовал механизм в общих чертах, как запустить .ехе файл обычного Hello World! из другого консольного приложения, и как это...

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

33
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
29.10.2014, 09:53
Цитата Сообщение от Sasha Посмотреть сообщение
чтобы второй екхешник с vcl не запускался двойным кликом, а запускался только сугубо консольным екзешником. Я сделал проверку на двойной клик
Мне кажется плохой подход. Лучше бы реализовать это с помощью именованного мьютекса. Консольное приложение его создает, а визуальное проверяет его наличие при запуске.

Цитата Сообщение от Sasha Посмотреть сообщение
Может быть это связано что 1 секунды мало, чтобы консоль задержался, но мне не хочется чтобы консольное окно висело очень долго пока его найдёт FindWindow.
Все варианты с задержкой в одну секунду, в сто двадцать пять парсеков, в три с половиной попугая это все очень худо. Это не надежно. Потестить что-либо таким образом это пожалуйста, а вот в реальном приложении лучше такого избегать.
Запустите консольное приложение, разместите в нем WaitForSingleObject и заставьте его ждать открытия второго приложения, которое отошлет сообщение о своей полной загрузке. После этого и закрывайте консоль.

P.S. Зачем вам именно CreateProcessWithLogonW?
0
 Аватар для Lelik-pahan
1708 / 904 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
29.10.2014, 10:04
Лучший ответ Сообщение было отмечено Sasha как решение

Решение

запуская оконное приложение из консольного, передавай какой-либо параметр. А в самом оконном приложение проверяй этот параметр.
C++
1
2
3
4
5
6
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    if (ParamCount() < 1 || ParamStr(1) != "параметр")        
        return 0;
...
}
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.10.2014, 11:56  [ТС]
Lelik-pahan,
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
передавай какой-либо параметр
, а передавать параметр при помощи SendMessage()

Добавлено через 20 минут
Цитата Сообщение от SatanaXIII Посмотреть сообщение
CreateProcessWithLogonW
Запустить прогпмму под опытным пользолвателем
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
29.10.2014, 12:15
Sasha, не нужен в том методе, который предлагает Lelik-pahan, никакой SendMessage. Имеется в виду параметр ком. строки (просто добавь его после имени запускаемого файла в rtyu)...
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.10.2014, 13:22  [ТС]
UI, чё-то не получается
написал в консоле так
C++
1
2
3
4
5
6
7
 PROCESS_INFORMATION pi = {0};
         STARTUPINFOW si = {0};
         si.cb = sizeof(STARTUPINFO);
         if (CreateProcessWithLogonW(L"User1", NULL, L"1", 0,rtyu.w_str(),L"AdminPrava", 0, NULL, NULL, &si, &pi)==false)
        {
           ShowMessage(SysErrorMessage(GetLastError()));
        }
а в оконном так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
 
    if (ParamCount() < 1 || ParamStr(1) != L"AdminPrava")
    {
        TForm *FMess;
        FMess = CreateMessageDialog("Запуск этого приложения осуществляется при помощи другой программы!!!",mtWarning,TMsgDlgButtons() << mbOK);
        FMess->Caption = "Внимание";
        FMess->ShowModal();
        delete FMess;
        FMess = NULL;
        return 0;
    }
}
Пишет Запуск этого приложения осуществляется при помощи другой программы может я этот параметр записал не туда так вроде 6 параметр функции там идёт командная строка
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
29.10.2014, 14:25
Лучший ответ Сообщение было отмечено Sasha как решение

Решение

Sasha,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    UnicodeString rtyu = ExtractFilePath(ParamStr(0)) + L"Project1.exe";
    UnicodeString params = UnicodeString().sprintf(L"\"%s\" /AdminPrava", rtyu);
    if (FileExists(rtyu))
    {
        PROCESS_INFORMATION pi = {0};
        STARTUPINFOW si = {0};
        si.cb = sizeof(STARTUPINFO);
        if (CreateProcessWithLogonW(L"user", NULL, L"pass", 0, NULL,
           params.w_str(), 0, NULL, NULL, &si, &pi) == false)
        {
            ShowMessage(SysErrorMessage(GetLastError()));
        }
        else
        {
            ShowMessage(L"Запуск");
        }
 
    }
+
C++
1
if (ParamCount() < 1 || ParamStr(1) != L"/AdminPrava")
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
30.10.2014, 19:22  [ТС]
Сделал загрузку консоли (т.е 1 экзешника) вместе с запуском виндовса через реестр. Иногда под опытным пользователем, а также бывало и под администратором фунция CreateProcessWithLogonW() через GetLastError() выводит ошибку 1056: Одна копия службы уже запущена. Из-за чего вылетает такая ошибка? Как-то можно с ней справится?
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
31.10.2014, 13:46
Как запустить одну программу из другой
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.10.2014, 15:34  [ТС]
Kabak, спасибо тебе за ссылку, но она бесполезна так как ни в одной из представленных функций нет возможности вписать логин и пароль потому как программу нужно запустить под опытным пользователем и с правами администратора
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
31.10.2014, 15:38
В чём проблема передать логин и пароль в качестве аргументов при запуске ?

C++
1
int _tmain(int argc, char *argv[])
откомпилируй программу с manifest и установи там права администратора
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.10.2014, 15:54  [ТС]
Цитата Сообщение от Kabak Посмотреть сообщение
В чём проблема передать логин и пароль в качестве аргументов при запуске ?
Приведи пример как это можно сделать?

Добавлено через 10 минут
Цитата Сообщение от Kabak Посмотреть сообщение
откомпилируй программу с manifest и установи там права администратора
И каким образом я передам проль через параметры администратору которого я установил в манифесте?
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
31.10.2014, 16:04
Как с любой программой которая поддерживает аргументы при запуске:

C++
1
2
3
4
5
6
7
HINSTANCE ShellExecute(          HWND hwnd,
    LPCTSTR lpOperation,
    LPCTSTR lpFile,
    LPCTSTR lpParameters,
    LPCTSTR lpDirectory,
    INT nShowCmd
);
lpParameters
[in] If the lpFile parameter specifies an executable file, lpParameters is a pointer to a null-terminated string that specifies the parameters to be passed to the application. The format of this string is determined by the verb that is to be invoked. If lpFile specifies a document file, lpParameters should be NULL.

В качестве параметров передавай логин и пароль. А exe который хочешь запустить с параметрами откомпилируй чтобы она при старте анализировала переданы ли ей параметры в
C++
1
int _tmain(int argc, char *argv[])
почитай как запустить любую программу с параметрами ( если её предусмотрено запускать с ними. Ты написал что оба exe написаны тобой. Вот и откомпилируй тот exe который нужно запустить с параметрами чтобы он их анализировал. Любой exe - это функция main или _tmain которая запускается с аргументами/параметрами или без них )

Как в старые добрые времена архиваторами типа pkzip.exe пользовались когда MS-DOS был.

Пример запуска с параметрами:

C++
1
2
3
4
5
6
7
8
9
if((UINT)ShellExecute(
    NULL,
    L"open",
    L"notepad.exe",
    L"Mydocument.txt",
    NULL,
    SW_SHOWNORMAL) <= 32) {
    // обработка ошибок
}
Notepad откроет документ Mydocument.txt, если программисты которые создали Notepad.exe написали анализ параметров int argc, char *argv[] при запуске.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.10.2014, 16:21  [ТС]
Цитата Сообщение от Kabak Посмотреть сообщение
Любой exe - это функция main или _tmain которая запускается с аргументами/параметрами или без них
Сколько делал vcl-приложений никогда в них не писал main или tmain
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
31.10.2014, 16:33
Как называется ваш проект в Builder ?

ПРИМЕР:
Там есть функция :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->Title = "ПРИМЕР";
        Application->CreateForm(__classid(TMainForm1), &MainForm1);
        Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}
C++
1
2
3
4
5
6
int CALLBACK WinMain(
  _In_  HINSTANCE hInstance,
  _In_  HINSTANCE hPrevInstance,
  _In_  LPSTR lpCmdLine,
  _In_  int nCmdShow
);
_tWinMain

lpCmdLine [in]

Type: LPSTR

The command line for the application, excluding the program name. To retrieve the entire command line, use the GetCommandLine function.

можно передать строку параметров, а в ней как угодно передать L"Логин пароль" или L"Логин,Пароль", или L"#Логин %Пароль" и просто написать анализатор этого параметра внутри WinMain
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
31.10.2014, 16:38
Цитата Сообщение от Kabak Посмотреть сообщение
В чём проблема передать логин и пароль в качестве аргументов при запуске ?
И чего тебе это даст, уже после запуска программы с правами того же пользователя, что и вызывающая программа, получить параметрами логин/пароль. Уууу, великое достижение. Дальше что с паролем будешь делать? Куда его передавать?

А если задать манифест - то все будет еще интереснее. Повторяю вопрос: как из программы ты собрался вводить имя/пароль в то диалоговое окно, которое запускается даже не от админа, а от системы? И не надо общих слов, конкретно пальцемкодом покажи...
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
31.10.2014, 18:29
Последний раз писал такое в 80-x ещё под DOS. Во всяком случае, в консольное приложение передать аргументы и сейчас нет проблем.

UI, вы не знаете как запустить VCL Form приложение с параметрами ?
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
02.11.2014, 23:00
1) Как проверить аргумент при запуске.
C++
1
2
3
4
5
6
7
8
9
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    if (strcmp(lpCmdLine, "-start"))
    return 0; //exit
    else
    {
    //rest of the program
    }
}
Потом создать глобальные переменные Логина и Пароля до
C++
1
Application->CreateForm(__classid(TForm1), &Form1);
и использовать их в форме запускаемого приложения.

2) Можно в главной функции приложения _tWinMain используя WINAPI записать параметры в Registry и в запускаемой программе прочитать параметры: пароль и логин из Registry.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 10:34  [ТС]
Kabak, а ничего что, функции
C++
1
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
и как у меня вот такая функция отличаются
C++
1
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 10:39
Чем ? Предпоследний параметр LPTSTR lpCmdLine - строка содержащая переменные для запуска с параметрами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.11.2014, 10:39
Помогаю со студенческими работами здесь

Запустить программу из другой программы в качестве нового процесса
Нужно запустить программу из другой программы: Первая программа, которую нужно запустить: #include &lt;iostream&gt; using namespace...

Как запустить программу в другой папке?
Существует у меня функция, которая создает лог. Как бы я не крутился - файл создается в папке, где запустили программу. Я решил пойти...

Как запустить код на другой странице
В общем, вот: есть страница, генерируемая с помощью cgi. Могу ли я на ней выполнить код, который будет находиться на другом сервере...

Как из одного макроса запустить другой
Друзья, помогайте! Есть один макрос, который надо вставить в другие. как это сделать? (чтобы не вставлять исходник)

Как запустить одну программу из другой?
Написать 2 программы. 1-ая – управляющая, 2-ая – клиент. Программа клиент отображает число и меняет произвольную цифру на 1 каждую секунду....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru