example createthread c winapi createprocess

example - createthread



CreateProcess() falla con una infracción de acceso (3)

Prueba esto, debería funcionar.

TCHAR lpszClientPath[500]= TEXT("c://users//e//desktop//mspaint.exe"); if(!CreateProcess(NULL, lpszClientPath, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE|CREATE_UNICODE_ENVIRONMENT,NULL, NULL, &si, &pi)) { printf( "CreateProcess failed (%d)./n", GetLastError() ); return; } ... ...

Mi objetivo es ejecutar un ejecutable externo en mi programa. Primero, utilicé la función system() , pero no quiero que el usuario vea la consola. Entonces, busqué un poco y encontré la función CreateProcess() . Sin embargo, cuando intento pasarle un parámetro, no sé por qué, falla. Tomé este código de MSDN y cambié un poco:

#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) L"c://users//e//desktop//mspaint.exe", // 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 ); }

Sin embargo, este código creó una violación de acceso de alguna manera. ¿Puedo ejecutar mspaint sin mostrar al usuario la consola?

Muchas gracias.


El segundo argumento es un LPTSTR , a saber, un puntero a una matriz de caracteres no const. Los documentos dicen específicamente:

este parámetro no puede ser un puntero a la memoria de solo lectura (como una variable const o una cadena literal)

La razón por la que pasa un literal de cadena es un problema:

El sistema agrega un carácter nulo de terminación a la cadena de línea de comandos para separar el nombre del archivo de los argumentos. Esto divide la cadena original en dos cadenas para procesamiento interno.

Lo que significa que en su caso, intenta modificar la memoria de solo lectura, de ahí el bloqueo.


Cambia tu código a esto:

#include <windows.h> #include <stdio.h> #include <tchar.h> void _tmain( int argc, TCHAR *argv[] ) { TCHAR ProcessName[256]; STARTUPINFO si; PROCESS_INFORMATION pi; wcscpy(ProcessName,L"c://users//e//desktop//mspaint.exe"); 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) ProcessName, // 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 ); }