none
saber el id de un proceso RRS feed

  • Pregunta

  • Tengo problemas a la hora de saber el id de un proceso que quiero matar desde el servicio. Me dice que la funcion no devuelve nada. Cosa que si lo compilo como un programa consola, si lo hace bien.


    int cService::GetProcessID(char processName)
    {
       DWORD WINAPI GetProcessID(processName);
    }


    void cService::killpc(){

    string name = "notepad";
    char pidname;
    int pid;
    pidname = (char ) name.c_str();
    pid = GetProcessID(pidname);

           int ret=1;
            HANDLE pHandle;

            if ((pHandle = OpenProcess(PROCESS_ALL_ACCESS,false,pid)) != NULL)
                    if(!TerminateProcess(pHandle,0)) {
                            ret=0;
                            CloseHandle(pHandle);
                        }

    }


    Por si os sirve para ayudarme, lo que quiero es tener una funcion para matar un proceso en concreto desde el servicio.

    Muchas Gracias Por Adelantado.
    lunes, 14 de septiembre de 2009 9:46

Respuestas

  • void

     

    cService::killpc(){

    HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    DWORD dwsma = GetLastError();

    DWORD dwExitCode = 0;

    PROCESSENTRY32 procEntry={0};

    procEntry.dwSize =

    sizeof( PROCESSENTRY32 );

    Process32First(hndl,&procEntry);

     

    do

    {

     

    if(!strcmpi(procEntry.szExeFile,"calc.exe"))

    {

     

    break;

    }

    }

    while(Process32Next(hndl,&procEntry));

     

     

    ///////////////////////////////////////////////////////////////

    HANDLE hHandle;

    hHandle = ::OpenProcess(PROCESS_ALL_ACCESS,0,procEntry.th32ProcessID);

     

    ::GetExitCodeProcess(hHandle,&dwExitCode);

    ::TerminateProcess(hHandle,dwExitCode);

    }



    Ya está, con este codigo ya me funciona. Muchas Gracias, y perdon las molestias; pero así todos aprendemos.

    • Marcado como respuesta Doberdog martes, 22 de septiembre de 2009 17:49
    martes, 22 de septiembre de 2009 17:49

Todas las respuestas

  • No puedes obtener el ID de un proceso a partir de su nombre. Lo que extraña es que el compilador no te haya avisado de ello. Si lo que quieres es matar un proceso el camino es otro.

    Aquí tienes un ejemplo que podría funcionar a partir de un nombre: http://www.physiology.wisc.edu/ravi/Software/killproc/


    Y aquí otro acercamiento: http://www.codeproject.com/KB/system/Kill_Application.aspx
    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    miércoles, 16 de septiembre de 2009 10:30
    Moderador
  • Con este codigo puedo hacer lo que quiero, lo quité de un foro y si me funciona desde un Windows Form, desde un Button. Pero a la hora de compilarlo en el servicio me casca por todos lados, sobretodo por el GetPrecessesByName. por el using namespace Windows y el using namespace Windows::Diagnostics, que no es un namespace valido. Por eso estoy buscando otra forma.

    array<Process^>^ proc = Process::GetProcessesByName(L"Notepad");
     for (int i = 0; i < proc->Length; i++) proc[i]->Kill();


    miércoles, 16 de septiembre de 2009 11:27
  • Pero es que eso es C++/CLI, no C++.

    El namespace que tienes que usar es este:

    System::Diagnostics

    Poniendo eso al principio de la ficha debería funcionarte.
    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    miércoles, 16 de septiembre de 2009 11:30
    Moderador
  •  error C2653: 'System' : no es un nombre de clase o espacio de nombres
     error C2871: 'Diagnostics' : no existe ningún espacio de nombres con este nombre

    Me da estos errores, por eso quiero tirar por otro lado. Para hacerlo.


    Por cierto, los dos vinculos. Al intentar compilar el codigo en sí, para ver como funciona en mi maquina, los dos me cascan... Pero bueno, cosas que pasan.

    miércoles, 16 de septiembre de 2009 14:40
  • A ver, vayamos por partes.

    Dime qué aparece en las propiedades del proyecto, en la pestaña General -> Common Language Runtime Support.

    Si te aparece "No Common Language Runtime support" no puedes usar lo que quieres usar.

    Si quieres usarlo porque es más fácil, tendrás que poner "Common Language Runtime support (/clr)", pero entonces tu aplicación necesitará tener instalado el .NET Framework en los clientes en los que pongas tu programa.
    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    jueves, 17 de septiembre de 2009 8:57
    Moderador
  • Es que precisamente no puedo instalar el .net FrameWork en todas las maquinas en las que tengo que manejar el servicio. 

    Por eso tengo que hacerlo de otra forma.
    jueves, 17 de septiembre de 2009 12:50
  • Pues por eso la solución que has encontrado no te sirve de nada porque es para .NET.

    Otra solución para hacerlo: http://www.codeproject.com/KB/threads/killprocess.aspx
    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 18 de septiembre de 2009 9:18
    Moderador
  • no me compila eso. Bueno, no pasa nada. Por que se me ocurre que puedo listar los procesos que corren en la maquina, e ir revisando todos uno a uno, hasta localizar uno que tenga de nombre XYZ. De esa forma ya lo tengo. y lo mato.

    viernes, 18 de septiembre de 2009 16:09
  • Una opción perfectamente válida.

    Yo el ejemplo no lo he probado, ¿pero cuál es el error que te da?
    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    lunes, 21 de septiembre de 2009 9:39
    Moderador
  • 1>------ Operación Generar iniciada: proyecto: ffsd, configuración: Debug Win32 ------
    1>Compilando...
    1>ffsd.cpp
    1>c:\documents and settings\jorge\my documents\visual studio 2008\projects\ffsd\ffsd\ffsd.cpp(147) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>        c:\program files\microsoft visual studio 9.0\vc\include\string.h(74) : vea la declaración de 'strcpy'
    1>c:\documents and settings\jorge\my documents\visual studio 2008\projects\ffsd\ffsd\ffsd.cpp(156) : error C2664: 'DWORD (HANDLE,HMODULE,LPTSTR,DWORD)' : no se puede convertir el parámetro 3 de 'char [260]' a 'LPTSTR'
    1>        Los tipos señalados no están relacionados; la conversión requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función
    1>c:\documents and settings\jorge\my documents\visual studio 2008\projects\ffsd\ffsd\ffsd.cpp(156) : error C2664: 'DWORD (HANDLE,HMODULE,LPTSTR,DWORD)' : no se puede convertir el parámetro 2 de 'HANDLE' a 'HMODULE'
    1>        La conversión de 'void*' a puntero a elemento que no sea 'void' requiere una conversión explícita
    1>c:\documents and settings\jorge\my documents\visual studio 2008\projects\ffsd\ffsd\ffsd.cpp(273) : error C2664: 'strcmp' : no se puede convertir el parámetro 1 de 'WCHAR [256]' a 'const char *'
    1>        Los tipos señalados no están relacionados; la conversión requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función


    ----------------------------------------


    Esto es lo que me suelta. Sin tocar el codigo para nada.
    martes, 22 de septiembre de 2009 8:39
  • void

     

    cService::killpc(){

    HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    DWORD dwsma = GetLastError();

    DWORD dwExitCode = 0;

    PROCESSENTRY32 procEntry={0};

    procEntry.dwSize =

    sizeof( PROCESSENTRY32 );

    Process32First(hndl,&procEntry);

     

    do

    {

     

    if(!strcmpi(procEntry.szExeFile,"calc.exe"))

    {

     

    break;

    }

    }

    while(Process32Next(hndl,&procEntry));

     

     

    ///////////////////////////////////////////////////////////////

    HANDLE hHandle;

    hHandle = ::OpenProcess(PROCESS_ALL_ACCESS,0,procEntry.th32ProcessID);

     

    ::GetExitCodeProcess(hHandle,&dwExitCode);

    ::TerminateProcess(hHandle,dwExitCode);

    }



    Ya está, con este codigo ya me funciona. Muchas Gracias, y perdon las molestias; pero así todos aprendemos.

    • Marcado como respuesta Doberdog martes, 22 de septiembre de 2009 17:49
    martes, 22 de septiembre de 2009 17:49