 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 04 Sep, 2010 12:55 pm Asunto: Conocer si una aplicación de 16 bits está corriendo. |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 16 Sep, 2010 3:21 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 16 Sep, 2010 6:59 pm Asunto: |
|
|
| 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|