Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

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

28.10.2014, 19:37. Показов 3050. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru