已知:
    进程A启动进程B,进程B启动进程C,
问:如何在进程A中结束进程C?如何拿到进程C的句柄?
我用terminateThread函数,但进程C的句柄我无法拿到,牛人指点一个行之有效的途径,非常感谢再问:如果取得一个进程的ID,能否得到它的句柄及该进程的相关信息?

解决方案 »

  1.   

    HWND hWnd=::FindWindow(NULL,c);
    ::SendMessage(hWnd,WM_CLOSE,0,0);
      

  2.   

    DWORD GetProcessID(LPCTSTR lpszProcessName)
    {
    DWORD dwRet = 0;
    char buffer[300],*strExePath,*strProcessName; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hSnapshot != INVALID_HANDLE_VALUE)
    {
    PROCESSENTRY32 ProcessEntry;  
    ZeroMemory(&ProcessEntry,sizeof(PROCESSENTRY32));
    ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    BOOL bFlag = Process32First(hSnapshot,&ProcessEntry);
    while(bFlag)
    {
    strcpy(buffer,ProcessEntry.szExeFile);
    strExePath=_strupr(_strdup(buffer));
    strProcessName=_strupr(_strdup(lpszProcessName));
    if(strstr(strExePath,strProcessName) != NULL)
    {
    dwRet = ProcessEntry.th32ProcessID;
    break;
    }
    ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    bFlag = Process32Next(hSnapshot,&ProcessEntry);
    }
    CloseHandle(hSnapshot);
    }
    return dwRet;
    }
      

  3.   

    可以考虑这种方案,进程B启动C时,记录C的进程句柄,通过某种方式(如进程间通信)通知给A
      

  4.   

    可以的,创建进程是不是可以指定是否继承什么的,通过DuplicateHandle可以让A获得C进程的柄 ,直接TerminateProcess就可以了。Windows核心编程里有介绍
      

  5.   

    在A进程中是可以知道B进程的ID的,因此可取得其进程句柄.然后在A进程中对所有进程做枚举,找出所有的C进程,将其父进程的句柄与原进程句柄相比较,可得到要杀的C进程句柄,然后......
      

  6.   

    "可以考虑这种方案,进程B启动C时,记录C的进程句柄,通过某种方式(如进程间通信)通知给A"这种作法比较合理。采用进程间通信的作法,简单的比如SendMessage(),让进程B告诉进程A关于进程C的句柄。
      

  7.   

    这只是进程间通信的应用而已
    而进程间通信的方法很多,管道、邮槽。。
    参考《Windows核心编程》
      

  8.   

    《Windows核心编程》有比较详细的介绍.
      

  9.   

    b知道啊。a要咔嚓掉c, a和b通信阿,发给消息给b通知关掉c,不就关掉了
      

  10.   

    不管用什么方法,你必须得到C进程的id
    然后,
    HANDLE hp = OpenProcess(PROCESS_ALL_ACCESS,FALSE,id);
    TerminateProcess(hp,0);
      

  11.   

    同意b进程中在创建c进程时记录下c进程的句柄,但不赞成b通过sendMessage()来通知a,因为没有说明a是有消息循环的,
      

  12.   

    把a放进一个作业中,结束b,c也结束