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

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

28.10.2014, 19:37. Показов 2938. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru