/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

C++ Saber si un programa externo se encuentra en ejecucion

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
rault



Registrado: 30 Nov 2007
Mensajes: 1

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com