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

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

28.10.2014, 19:37. Показов 2803. Ответов 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
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 12:25  [ТС]
Студворк — интернет-сервис помощи студентам
Вот написал в vcl-приложение


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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
 
   if (strcmp(lpCmdLine, "-start"))
   return 0; //exit
   else
   {
        TForm *FMess;
        FMess = CreateMessageDialog("Запуск этого приложения осуществляется при помощи другой программы!!!",mtWarning,TMsgDlgButtons() << mbOK);
        FMess->Caption = "Внимание";
        FMess->ShowModal();
        delete FMess;
        FMess = NULL;
        return 0;
 
 
   //rest of the program
   }
 
    try
    {
        Application->Initialize();
        TStyleManager::TrySetStyle("Amakrits");
        Application->Title = "Update";
                      UnicodeString login,pass;
        Application->CreateForm(__classid(TOptions), &Options);
        Application->CreateForm(__classid(TProgress), &Progress);
        Application->Run();
 
        //ReleaseMutex(hMutex);
 
    }
    catch (Exception &exception) {
        Application->ShowException(&exception);
    }
    catch (...) {
        try {
            throw Exception("");
        }
        catch (Exception &exception) {
            Application->ShowException(&exception);
        }
    }
    return 0;
}
А как с консоли передать сейчас эти параметры?
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 13:00
Вы хотели из консольного приложения запустить VCL с параметрами, так ?

В консольном приложении выполните :
C++
1
2
3
4
5
6
7
8
9
 if((UINT)ShellExecute(
    NULL,
    L"open",
    L"ВАША VCL программа.exe",
    L"Логин:Паша, Пароль:Маша",
    NULL,
    SW_SHOWNORMAL) <= 32) {
    // обработка ошибок
}
И проанализируйте LPTSTR lpCmdLine = L"Логин:Паша, Пароль:Маша" в VCL приложении при его запуске
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 15:55  [ТС]
Вот сделал так в vcl

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
 
 
   if (strcmp(lpCmdLine, "Паша,Маша")!=0)
   {
    TForm *FMess;
    FMess = CreateMessageDialog(L"Запуск этого приложения осуществляется при помощи другой программы!!!",mtWarning,TMsgDlgButtons() << mbOK);
    FMess->Caption = L"Внимание";
    FMess->ShowModal();
    delete FMess;
    FMess = NULL;
    return  0;
   }
 
 
    try
    {
        Application->Initialize();
        TStyleManager::TrySetStyle("Amakrits");
        Application->Title = "Update";
        UnicodeString login,pass;
        Application->CreateForm(__classid(TOptions), &Options);
        Application->CreateForm(__classid(TProgress), &Progress);
        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
7
8
9
10
11
12
13
14
int _tmain(int argc, _TCHAR* argv[])
{
   if((UINT)ShellExecute(NULL,L"open",L"Update.exe",L"Паша,Маша",NULL,SW_SHOWNORMAL) <= 32)
     {
 
       ShowMessage(SysErrorMessage(GetLastError()));
 
     }
 
 
 
 
  return 0;
}
Kabak, А как теперь сделать чтобы прога запускалась от имени администратора в профиле опытного пользователя?
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 16:04
Параметры передались в VCL приложение ?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 16:05  [ТС]
Цитата Сообщение от Kabak Посмотреть сообщение
Параметры передались в VCL приложение ?
Да передались
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 16:08
Kabak, А как теперь сделать чтобы прога запускалась от имени администратора в профиле опытного пользователя?
Манифест монтировали в вашаvlcпрограмма.exe при компиляции ? чтобы запускалась с правами администратора
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 16:10  [ТС]
Цитата Сообщение от Kabak Посмотреть сообщение
Манифест монтировали в вашаvlcпрограмма.exe при компиляции ? чтобы запускалась с правами администратора
Нет не монтировал

Добавлено через 23 секунды
А какой именно манифест?
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 16:14
почитайте, правда на английском

При создании exe нужно прилинковать в проект вот такой вот файл ИМЯВАШЕЙПРОГРАММЫ.manifest :
XML
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
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
     <application>
       <!--The ID below indicates application support for Windows Vista -->
       <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
       <!--The ID below indicates application support for Windows 7 -->
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
     </application>
   </compatibility>
   <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="ИМЯ ВАШЕЙ ПРОГРАММЫ БЕЗ РАСШИРЕНИЯ  (CASE SENSITIVE !!!)"
      type="win32"/>
   <description>My application description</description>
   <!-- Identify the application security requirements. -->
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
     <security>
       <requestedPrivileges>
         <requestedExecutionLevel
           level="requireAdministrator"
           uiAccess="false"/>
         </requestedPrivileges>
        </security>
   </trustInfo>
   <dependency>
     <dependentAssembly>
       <assemblyIdentity
         type="win32"
         name="Microsoft.Windows.Common-Controls"
         version="6.0.0.0"
         processorArchitecture="x86"
         publicKeyToken="6595b64144ccf1df"
         language="*"
       />
     </dependentAssembly>
   </dependency>
</assembly>
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 16:28
1) откройте любой текстовый редактор, лучше notepad.exe
2) скопируйте текст XML который я привёл выше
3) замените ИМЯ ВАШЕЙ ПРОГРАММЫ БЕЗ РАСШИРЕНИЯ (CASE SENSITIVE !!!) на имявашегоVCLприложение.exe без расширения

Вот здесь ( смотри скриншот ) указать путь к ВАШАПРОГРАММА.manifest

Откомпилировать приложение. Должно запускаться с правами админа.
Миниатюры
Как запустить екзешник из другой программы?  
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 17:26  [ТС]
Kabak, Сделал как Вы говорили. Скопировал 2 свои программы на Диск С. Перезагрузился зашёл под правами опытного пользователя. Запустил свою консольку, кансолька запустила vcl-приложение. Всё нормально. Потом я решил занести некоторые данные из своей vcl-программы в ини-файл, который автоматом создаётся дам где находится екзешник и в результате мне выдало ошибку что невозможно записать данные в ини. Поэтому могу сказать, что наврятли манифест помог, потому как он особых полномочий не даёт для создания и изменения файлов создающимся из моей программы. А без этого программа не работает должным образом. Походу скорее всего UI был прав.
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 18:38
Если ini файл создаётся вашей программой и Windows это позволяет, то непонятно почему Windows не позволяет вам писать в этот файл. Нужно разбираться, какие привелегии даёт программе запуск от имени администратора.
И может можно что-нибудь настроить в Windows на компьютере где предполагается всё это использовать, чтобы не было проблем.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 19:52  [ТС]
Цитата Сообщение от Kabak Посмотреть сообщение
Если ini файл создаётся вашей программой и Windows это позволяет, то непонятно почему Windows не позволяет вам писать в этот файл. Нужно разбираться, какие привелегии даёт программе запуск от имени администратора.
И может можно что-нибудь настроить в Windows на компьютере где предполагается всё это использовать, чтобы не было проблем.
При использовании метода CreateProcessWithLogonW таких проблем небыло, файл создавался и информация в нём изменялась без проблем. И права нигде не надо было дополнительно включать
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
03.11.2014, 20:31
А что за задача стоит перед вами ? Что не так с правами пользователей на компьютере ? При старте темы вы про права ничего не упоминали.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.11.2014, 20:44  [ТС]
И прав
Цитата Сообщение от Kabak Посмотреть сообщение
А что за задача стоит перед вами ? Что не так с правами пользователей на компьютере ? При старте темы вы про права ничего не упоминали.
Ну вообще-то при запуске программы от Администратора под опытным пользователем я и так подразумевал что никаких ограничений небудет поэтому при старте программы этого и не упоминал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.11.2014, 20:44
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru