VC++ determina si el proceso existe
pe.dwSize=sizeof(PROCESSENTRY32); //Esta oración especifica claramente el tamaño de la estructura PROCESSENTRY32. Parece redundante, pero no lo es. Esta oración puede parecer redundante, pero MSDN estipula que no se puede omitir, lo he probado yo mismo y es incorrecto omitir esta oración.
if(!Process32First(hSnapshot,&pe)) return 0; // Esta línea llama a Process32First para comenzar a recorrer la lista de procesos en la instantánea y copia la información del proceso en la estructura de datos pe. Si falla al devolver FALSE, no es necesario realizar un Process32Next posterior para recorrer toda la lista. Utilice la función Process32Next para recorrer la lista de procesos uno por uno. Los parámetros de Process32Next son los mismos que los de Process32First. En caso de error, la información del proceso en la lista de instantáneas se copiará una por una en la estructura de datos pe. . Vale la pena mencionar que debido al uso de instantáneas de procesos para obtener información del proceso, si un determinado proceso o algunos procesos en el proceso son cerrados por otros programas o finalizan solos, o se agrega un nuevo proceso a la cola de procesos, la instantánea señalado por hSnapShot no reflejará este cambio. Las instantáneas son como tomar fotografías de personas, solo registran la apariencia momentánea de una persona. SnapShot es como tomar una fotografía de una persona. Solo registra la apariencia momentánea de una persona, pero filosóficamente hablando, las cosas están en movimiento y no pueden representar el estado actual de una persona. De manera similar, la instantánea del proceso aquí solo puede reflejar el estado de todos los procesos en la cola de procesos del sistema cuando se creó la instantánea. ¿Cuáles son los beneficios de utilizar instantáneas? Es decir, no es necesario obtener repetidamente la lista de procesos en el sistema cada vez que se obtiene la información del proceso posterior, sino que se almacena en forma de instantánea, lo que es más rápido y favorece la protección de datos. La desventaja es que no es en tiempo real. Pero, en general, una instantánea es suficiente.
if(strcmp(pe.szExeFile,name)==0)// Esto es fácil de entender, es comparar si pe.szExeFile y el nombre son iguales. El método de comparación específico es. Compare la diferencia entre los dos códigos ASCII. Si no comprende el código ASCII y strcmp, si le pregunta a Baidu, no lo explicaré.
id=pe.th32ProcessID;
return id;
La función de estas dos oraciones juntas es devolver el PID del proceso, que está en CMD LISTA DE TAREAS El PID que ve es el ID utilizado para identificar de forma única el proceso. Las operaciones posteriores de OpenProcess que acceden al proceso requieren este ID. Puede usar OpenProcess para obtener el control del proceso hProcess y luego llamar a TerminateProcess hProcess,0 para forzar el final del proceso general.
El medio CloseHandle(hSnapshot); // Esta oración puede entenderse como recolección de basura y su función es liberar el espacio de memoria identificado por el identificador de instantánea creado con CreateToolhelp32Snapshot.
Además, el amigo de abajo tiene razón: su código no puede realizar una comparación que no distinga entre mayúsculas y minúsculas de los nombres de los procesos. Por lo tanto, es mejor agregar su propio procedimiento almacenado para normalizar el caso. Te daré una manera de hacerlo sin usar CString, solo como referencia:
De hecho, simplemente escribe una función que convierta todos los nombres a mayúsculas y luego compare.
//La función en línea devuelve una cadena vacía.
char en línea* DefReturn()
{
char *ret = nuevo char[1];
ret[0] = '\0';
return ret;
}
char* UCase(char *chOri)
{
if(chOri == NULL) return DefReturn();
size_t nLen = strlen(chOri);
if(nLen)
{
char *chRet = new char[nLen+1];
for(size_t index = 0; index { chRet[index] = toupper(chOri[index]); } chRet[index] = '\0'; return chRet ; } else { return chOri; } } //La comparación comienza después de convertir todo a mayúsculas y minúsculas internas if( strcmp(UCase(pe.szExeFile),UCase(name))==0) { id=pe.th32ProcessID; descanso; }