| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
rault
Registrado: 30 Nov 2007 Mensajes: 1
| Publicado: 30/11/2007 2:35 pm | | | Título: C++ Saber si un programa externo se encuentra en ejecucion |
| Buenos dias, me han pedido realizar un programa en Visual C++ que entre otra tareas, verifique si un programa se encuentra ejecutandose en windows. Yo cuento con el instalador de dicho programa. Es un programa propio que creamos con unos compañeros. Pero ahora mi nuevo programa tiene q saber si el otro programa esta EJECUTANDOSE O NO (EN WINDOWS), si no lo esta debo ejecutarlo desde mi nuevo programa. He buscado en librerias de C++ y lo mas cercano al tema q he encontrado es la funcion system() de la libreria stdlib, pero esto solo para ejecutar un programa externo, mas no para saber el estado del mismo. Estoy usando visual C++ 6.0 Gracias anticipadamente. Raul. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3828 Ubicación: Mexico
| Publicado: 30/11/2007 3:58 pm | | | Título: |
| Esa operacion no es posible solo con la biblioteca estandar de C++ ya que esta no tiene el concepto de procesos, threads, IPC, etc. Tienes que utilizar la API del SO (Win32 API).
Lo que sigue aplica solo si controlas el nombre del ejecutable a buscar.
Las funciones que te permiten obtener la lista de los procesos en ejecucion son CreateToolhelp32Snapshot, Process32First y Process32Next (mas informacion en MSDN).
Un ejemplo del uso de esas funciones (C + Win32) es:
| Código: | #include <windows.h> #include <tlhelp32.h>
#include <stdio.h>
int main(void) { char szDirectorio[MAX_PATH]; char szNombreCorto[MAX_PATH]; char szNombreLargo[MAX_PATH]; char cUltimoCaracter; int i; LPTSTR szLineaDeComandos; DWORD resultado; HANDLE hSnapshot; PROCESSENTRY32 stProcessEntry; /* Obtener el directorio actual */ if (!GetCurrentDirectory(sizeof szDirectorio, szDirectorio)) return EXIT_FAILURE; printf("El directorio actual es \"%s\"\n", szDirectorio); /* Obtenemos la linea de comandos ... */ szLineaDeComandos = GetCommandLine(); if (szLineaDeComandos[0] == '\"'){ szLineaDeComandos++; cUltimoCaracter = '\"'; }else cUltimoCaracter = ' '; /* ... y en base a esta obtenemos el nombre corto (8:3) ... */ for (i = 0; szLineaDeComandos[i] != cUltimoCaracter; i++) szNombreCorto[i] = szLineaDeComandos[i]; szNombreCorto[i] = '\0'; /* .. y en base al nombre corto obtenemos el nombre largo */ resultado = GetLongPathName(szNombreCorto, szNombreLargo, sizeof szNombreLargo); if (resultado > sizeof szNombreLargo || resultado == 0) return EXIT_FAILURE; printf("El nombre corto es \"%s\"\n", szNombreCorto); printf("El nombre largo es \"%s\"\n", szNombreLargo); puts("------------------------------"); puts("Los procesos en ejecucion son:\n"); /* Obtenemos una instantanea de los procesos en ejecucion */ if ((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == (HANDLE) -1) return EXIT_FAILURE; /* Ajustamos el miembro dwSize al tamaño de la estructura */ stProcessEntry.dwSize = sizeof(stProcessEntry); /* Obtenemos el primer proceso en ejecucion */ if (!Process32First(hSnapshot, &stProcessEntry)) return EXIT_FAILURE; /* Verificamos el valor de stProcessEntry.dwSize */ if (stProcessEntry.dwSize != sizeof(stProcessEntry)) return EXIT_FAILURE; /* Imprimimos el primer proceso ... */ printf("%s\n", stProcessEntry.szExeFile); /* ... y todos los procesos despues del primero */ while(Process32Next(hSnapshot, &stProcessEntry)) printf("%s\n", stProcessEntry.szExeFile); /* Cierra un 'handle', algo similar a fclose */ CloseHandle(hSnapshot); return EXIT_SUCCESS; } |
En mi caso la salida del programa es:
| Código: | >C:\rir3760\Devel\User\MS-DOS\SciTE\Lcc\Run.bat "C:\rir3760\Devel\ToDo\Win32\1_personal\CreateToolhelp32Snapshot" main ---------------------------------------------------- El directorio actual es "C:\rir3760\Devel\ToDo\Win32\1_personal\CreateToolhelp32Snapshot" El nombre corto es "C:\RIR3760\DEVEL\TODO\WIN32\1_PERS~1\CREATE~1\MAIN.EXE" El nombre largo es "C:\rir3760\Devel\ToDo\Win32\1_personal\CreateToolhelp32Snapshot\main.exe" ------------------------------ Los procesos en ejecucion son:
C:\WINDOWS\SYSTEM\KERNEL32.DLL C:\WINDOWS\SYSTEM\MSGSRV32.EXE C:\WINDOWS\SYSTEM\MPREXE.EXE C:\WINDOWS\SYSTEM\mmtask.tsk C:\WINDOWS\EXPLORER.EXE C:\WINDOWS\SYSTEM\SYSTRAY.EXE C:\WINDOWS\TASKMON.EXE C:\RIR3760\APPS\HOTKEYPLUS\HOTKEYPLUS.EXE C:\RIR3760\APPS\RUNIT\RUNIT.EXE C:\RIR3760\APPS\2XEXPLORER\2XEXPLORER.EXE C:\RIR3760\APPS\METAPAD\METAPAD.EXE C:\RIR3760\DEVEL\APPS\SCITE\SCITE.EXE C:\RIR3760\APPS\K-MELEON\K-MELEON.EXE C:\RIR3760\APPS\WINAMP\WINAMP.EXE C:\WINDOWS\SYSTEM\DDHELP.EXE C:\RIR3760\APPS\METAPAD\METAPAD.EXE C:\WINDOWS\SYSTEM\PSTORES.EXE C:\WINDOWS\SYSTEM\REDIR32.EXE C:\WINDOWS\SYSTEM\WINOA386.MOD C:\RIR3760\DEVEL\TODO\WIN32\1_PERSONAL\CREATETOOLHELP32SNAPSHOT\MAIN.EXE ---------------------------------------------------- Presione cualquier tecla para continuar . . . >Exit code: 0 |
Tal vez te sea de utilidad.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | Karman
Registrado: 15 Oct 2005 Mensajes: 312
| Publicado: 30/11/2007 10:12 pm | | | Título: |
| la forma más simple de resolverlo es mediante objetos MUTEX, en tu programa principal creas un objeto de dicho tipo y cuando abrís tu segundo programa preguntas si dicho objeto fue creado, en caso afirmativo tu programa está corriendo... esta técnica utilizan la mayoría de los programas para detectar si ya están ejecutándose... cualquier cosa busca CreateMutex en la web...
S2 _________________ www.inexinferis.co.nr
-. Karman .- |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |