Выполнение Windows-программы и обнаруживает, когда оно заканчивается C++

Другой системой (не упомянутый в принятом ответе все же) является PyInstaller, который работал на мой проект PyQt, когда py2exe не будет. Я нашел легче использовать.

http://www.pyinstaller.org/

Pyinstaller основан на Установщике Python Gordon McMillan. Который больше не доступен.

6
задан EBAG 4 December 2009 в 11:40
поделиться

5 ответов

Это цитата из здесь :

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

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

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

ZeroMemory( &sj, sizeof(sj) );
sj.cb = sizeof(sj);
ZeroMemory( &pj, sizeof(pj) );

// Start the child process p1.exe. Make sure p1.exe is in the
// same folder as current application. Otherwise write the full path in first argument.
if(!CreateProcess(L".\\p1.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj))
{
printf( "Hello CreateProcess failed (%d)\n", GetLastError() );
getch();
return;
}

// Start child process p2.exe. Make sure p2.exe is in the
// same folder as current application. Otherwise write the full path in first argument.
if(!CreateProcess(L".\\p2.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
printf( "CreateProcess2 failed (%d)\n", GetLastError() );
getch();
return;
}

// Wait until child processes exit.
WaitForSingleObject( pi.hProcess, INFINITE );
WaitForSingleObject( pj.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
CloseHandle( pj.hProcess );
CloseHandle( pj.hThread );
getch();
}
9
ответ дан 8 December 2019 в 13:46
поделиться

CreateProcess и WaitForSingleObject - простой способ добиться этого: вы получите дескриптор процесса из CreateProcess, затем дождитесь его с помощью WFSO, не забывая закрыть все используемые вами дескрипторы. Но подождите ... есть проблема. Проблема в том, что для процессов с графическим интерфейсом могут зависать оба процесса. Почему?

Проблема возникает из-за того, что ваше приложение имеет окно, но не перекачивает сообщения. Если созданное приложение вызывает SendMessage с одной из целей широковещательной рассылки ( HWND_BROADCAST или HWND_TOPMOST ), то SendMessage не вернется в новое приложение, пока все приложения не обработают сообщение, но ваше приложение не может обработать сообщение, потому что оно не перекачивает сообщения ... поэтому новое приложение блокируется, поэтому ваше ожидание никогда не завершается ... DEADLOCK.

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

2
ответ дан 8 December 2019 в 13:46
поделиться

В Windows вы можете используйте WaitForSingleObject для реализации этой функции.

1
ответ дан 8 December 2019 в 13:46
поделиться

При быстром поиске в Google я нашел эти два метода из msdn, которые могут быть полезны:

CreateProcess и GetExitCodeProcess . Предполагается, что вы создаете процесс в своем приложении.

Вы можете выполнить метод опроса, проверяя состояние созданного процесса. Я никогда не делал таких вещей, но это кажется мне очень странным подходом.

0
ответ дан 8 December 2019 в 13:46
поделиться

Альтернативный подход, который предлагает еще больший контроль, - это использование Win32 Job API, см. CreateJobObject () и AssignProcessToJobObject () . Это позволит вам отслеживать порожденный процесс асинхронно, используя порт завершения ввода-вывода, используя SetInformationJobObject () , это более сложно и, вероятно, больше, чем вам нужно, но дает вам гораздо больше контроля над порожденными процессами.

1
ответ дан 8 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

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