| 1 | #include <windows.h>
|
| 2 | #include <stdio.h>
|
| 3 |
|
| 4 | int main() {
|
| 5 | STARTUPINFO si;
|
| 6 | PROCESS_INFORMATION pi;
|
| 7 | BOOL success;
|
| 8 |
|
| 9 | // Initialize the STARTUPINFO structure
|
| 10 | ZeroMemory(&si, sizeof(si));
|
| 11 | si.cb = sizeof(si);
|
| 12 | ZeroMemory(&pi, sizeof(pi));
|
| 13 |
|
| 14 | // Command to execute with arguments
|
| 15 | // Note: We use double quotes around the Python command since the inner command uses single quotes
|
| 16 | char command[] = "python.exe -c \"print('hi from python 3'); import sys; sys.exit(42)\"";
|
| 17 |
|
| 18 | // Create the process
|
| 19 | success = CreateProcess(
|
| 20 | NULL, // No module name (use command line)
|
| 21 | command, // Command line with arguments
|
| 22 | NULL, // Process handle not inheritable
|
| 23 | NULL, // Thread handle not inheritable
|
| 24 | FALSE, // Set handle inheritance to FALSE
|
| 25 | 0, // No creation flags
|
| 26 | NULL, // Use parent's environment block
|
| 27 | NULL, // Use parent's starting directory
|
| 28 | &si, // Pointer to STARTUPINFO structure
|
| 29 | &pi // Pointer to PROCESS_INFORMATION structure
|
| 30 | );
|
| 31 |
|
| 32 | // Check if process creation was successful
|
| 33 | if (success) {
|
| 34 | printf("Process started successfully!\n");
|
| 35 |
|
| 36 | // Wait for the process to finish
|
| 37 | WaitForSingleObject(pi.hProcess, INFINITE);
|
| 38 |
|
| 39 | // Get the exit code
|
| 40 | DWORD exitCode;
|
| 41 | GetExitCodeProcess(pi.hProcess, &exitCode);
|
| 42 | printf("Process exited with code: %lu\n", exitCode);
|
| 43 |
|
| 44 | // Close process and thread handles
|
| 45 | CloseHandle(pi.hProcess);
|
| 46 | CloseHandle(pi.hThread);
|
| 47 | } else {
|
| 48 | printf("Failed to start process. Error code: %lu\n", GetLastError());
|
| 49 | }
|
| 50 |
|
| 51 | return 0;
|
| 52 | }
|