Как делают я звоню:: CreateProcess в C++ для запуска исполняемого файла Windows?

Я думаю, что «чисто» вы имеете в виду как с перенаправлением 300. Конфигурация для большого количества серверов & amp; языки здесь .

46
задан Aquarius_Girl 6 June 2016 в 08:52
поделиться

6 ответов

Что-то вроде этого:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(path, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    WaitForSingleObject(processInfo.hProcess, INFINITE);
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
}
70
ответ дан 1800 INFORMATION 26 November 2019 в 20:10
поделиться

Существует пример по телефону , который http://msdn.microsoft.com/en-us/library/ms682512 (По сравнению с 85) .aspx

Просто заменяет argv[1] Вашей константой или переменный содержащий программу.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}
20
ответ дан 1800 INFORMATION 26 November 2019 в 20:10
поделиться

Если Вы, приложение является приложением Windows GUI затем с помощью кода ниже, чтобы сделать ожидание, не идеальны, поскольку сообщения для приложения не будут получать обработку. Пользователю будет похоже, что Ваше приложение зависло.

WaitForSingleObject(&processInfo.hProcess, INFINITE)

Что-то как непротестированный код ниже мог бы быть лучше, поскольку это будет продолжать обрабатывать очередь сообщений окон, и Ваше приложение останется быстро реагирующим:

//-- wait for the process to finish
while (true)
{
  //-- see if the task has terminated
  DWORD dwExitCode = WaitForSingleObject(ProcessInfo.hProcess, 0);

  if (   (dwExitCode == WAIT_FAILED   )
      || (dwExitCode == WAIT_OBJECT_0 )
      || (dwExitCode == WAIT_ABANDONED) )
  {
    DWORD dwExitCode;

    //-- get the process exit code
    GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);

    //-- the task has ended so close the handle
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);

    //-- save the exit code
    lExitCode = dwExitCode;

    return;
  }
  else
  {
    //-- see if there are any message that need to be processed
    while (PeekMessage(&message.msg, 0, 0, 0, PM_NOREMOVE))
    {
      if (message.msg.message == WM_QUIT)
      {
        return;
      }

      //-- process the message queue
      if (GetMessage(&message.msg, 0, 0, 0))
      {
        //-- process the message
        TranslateMessage(&pMessage->msg);
        DispatchMessage(&pMessage->msg);
      }
    }
  }
}
10
ответ дан jussij 26 November 2019 в 20:10
поделиться

если Ваш exe, оказывается, консольное приложение, Вы могли бы интересоваться чтением stdout и stderr - для которого, я кротко отошлю Вас к этому примеру:

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q190351

Это - что-то вроде полного рта кода, но я использовал изменения этого кода, чтобы метать икру и читать.

7
ответ дан Mike Ellery 26 November 2019 в 20:10
поделиться

На полусвязанной ноте, если Вы хотите запустить процесс, который имеет больше полномочий, чем Ваш текущий процесс (говорят, запуская приложение администрирования, которое требует прав Администратора из главного приложения, работающего как обычный пользователь), Вы не можете сделать настолько использующего CreateProcess () на Vista, так как это не инициирует диалоговое окно контроля учётных записей (предположение, что это включено). Диалоговое окно контроля учётных записей инициировано при использовании ShellExecute (), все же.

7
ответ дан Andy 26 November 2019 в 20:10
поделиться

Примите во внимание, что использование WaitForSingleObject может получить Вас в проблему в этом сценарии. Следующее отрезано от подсказки относительно моего веб-сайта:

проблема возникает, потому что Ваше приложение имеет окно, но не качает сообщения. Если порожденное приложение вызовет SendMessage с одной из широковещательных целей ( HWND_BROADCAST или HWND_TOPMOST), то SendMessage не возвратится к новому приложению, пока все приложения не обработали сообщение - но Ваше приложение не может обработать сообщение, потому что это не качает сообщения...., таким образом, новое приложение запирается, таким образом, Ваше ожидание никогда не успешно выполняется.... МЕРТВАЯ БЛОКИРОВКА.

, Если Вы имеете неограниченный контроль над порожденным приложением, тогда существуют меры, которые можно принять, такие как использование SendMessageTimeout, а не SendMessage (например, для инициирования DDE, если кто-либо все еще использует это). Но существуют ситуации, которые вызывают неявные широковещательные сообщения SendMessage, над которыми Вы не имеете никакого контроля, такого как использование SetSysColors API, например.

единственные безопасные окольные пути это:

  1. отделяет Ожидание в отдельный поток, или
  2. используют тайм-аут на Ожидании и используют PeekMessage в Вашем Цикле ожидания, чтобы гарантировать, чтобы Вы накачали сообщения, или
  3. используют MsgWaitForMultipleObjects API.
3
ответ дан greatwolf 26 November 2019 в 20:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: