Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Conocer si una aplicación de 16 bits está corriendo.

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Conocer si una aplicación de 16 bits está corriendo. Responder citando

Las aplicaciones 16bits se ejecutan en una máquina virtual en el entorno NT. Por este motivo no se pueden enumerar con las utilidades tlhelp32.

Para enumerarlas tendremos que recorrer las máquinas virtuales que se estén ejecutando y sobre cada una de ellas enumerar las aplicaciones 16 bits que se ejecutan hasta encontrar la que nos interesa.

Código:

#include <vdmdbg.h>

bool IsRunning16_(char* Name)
{
  struct TRuningProcess16{
    char* Name;
    bool Running;

    static BOOL WINAPI
    ProcessTasks(DWORD dwThreadId, WORD hMod16, WORD hTask16, PSZ pszModName, PSZ pszFileName, LPARAM PE)
    {
       if(strstr(strupr(pszFileName), strupr(((TRuningProcess16*)PE)->Name)))
          return ((TRuningProcess16*)PE)->Running = true;
       return false;
    }
    static BOOL WINAPI
    ProcessVDMs(DWORD dwProcessId, DWORD dwAttrib, LPARAM PE)
    {
       VDMEnumTaskWOWEx(dwProcessId, (TASKENUMPROCEX)ProcessTasks, PE);
       return ((TRuningProcess16*)PE)->Running;
    }

  } PE = {Name,0};

  VDMEnumProcessWOW((PROCESSENUMPROC)PE.ProcessVDMs, (LPARAM)&PE);
  return PE.Running;
}


Ejemplo de uso:

Código:
bool R = IsRunning16_("VISOR.EXE");
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Yo, para comprobar si una aplicación está corriendo, uso un código que me pasó un compalero de trabajo. En el móculo que lanza la aplicación:
Código:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR cmdLine, int)
{
     HWND OtraVentana;

     OtraVentana = FindWindow(NULL, "Nombre de la aplicación");
     if (OtraVentana != NULL)
     {
          ShowWindow(OtraVentana, SW_RESTORE);
          SetForegroundWindow(OtraVentana);
          return 0;
     }

     try
     {
          Application->Initialize();
          Application->CreateForm(__classid(TForm1), &Form1);
          Application->Run();
     }
     catch (Exception &exception)
     {
           Application->ShowException(&exception);
     }
     return 0;
}

No sé si es lo mismo que buscas.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Código:
FindWindow(NULL, "Nombre de la aplicación");


Realmente con esto sólo encuentras el HANDLE de la ventana que tiene ese Caption. Para localizar si una aplicación corre, el método general es así:

Código:

//---------------------------------------------------------------------------
bool IsRuning(char* FileName)
{
   PROCESSENTRY32 Proceso;
   HANDLE ProcessHandle;
   bool Result = false;

   Proceso.dwSize = sizeof(PROCESSENTRY32);
   ProcessHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   if(Process32First(ProcessHandle, &Proceso)){
     do{
       if(!stricmp(Proceso.szExeFile, FileName)){
         Result = true;
         break;
       }
     }while(Process32Next(ProcessHandle, &Proceso));
   }
   CloseHandle(ProcessHandle);
   return Result;
}

Con este sistema controlamos los procesos, no las ventanas. Una aplicacioón sin ventana será encontrada. Con FindWindow no la encontraremos.

Cuando tratamos de localizar una aplicación de 16bits no la vamos a encontrar así, porque corre sobre una máquina virtual. Sólo veremos esa máquina virtual.

Para solucionar este último punto he diseñado la función bool IsRunning16_(char* Name) descrita al principio.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.