如题,请教高人帮忙,谢谢!
一个进程中CreateProcess创建另外一个进程执行exe文件。此时在创建进程suspend exe进程(无代码),是否可行?

解决方案 »

  1.   

    CreateProcess里面的dwCreationFlags参数有个就是CREATE_SUSPENDED
      

  2.   

    BOOL CreateProcess(
      LPCTSTR lpApplicationName,                 // name of executable module
      LPTSTR lpCommandLine,                      // command line string
      LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
      LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
      BOOL bInheritHandles,                      // handle inheritance option
      DWORD dwCreationFlags,                     // creation flags
      LPVOID lpEnvironment,                      // new environment block
      LPCTSTR lpCurrentDirectory,                // current directory name
      LPSTARTUPINFO lpStartupInfo,               // startup information
      LPPROCESS_INFORMATION lpProcessInformation // process information
    );
    我的意思是用上述函数开进程以后,UI界面接受到suspend消息后,我要通过什么函数或者方法来停止用CreateProcess开启的进程,因为此时进程已经在跑了。
    如果能给点参考代码,感激不尽啊。先谢谢各位朋友了。
      

  3.   

    我刚做过的一个程序,可以正常运行,你看看吧。希望对你有帮助。CString strFilePath1 =_T("picture1.exe");  
    PROCESS_INFORMATION pt;
    //STARTUPINFO si; //PC版这个参数不加,会导致创建进程出错,wce不用,直接为NULL memset(&pt, 0, sizeof(pt));// 将pt所指向的某一块内存中的每个字节的内容全部设置为0指定的ASCII值,
                                 //块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 if(!CreateProcess(strFilePath1, NULL, NULL, NULL, FALSE,CREATE_NEW_CONSOLE , NULL, NULL,/* &si*/NULL, &pt))
    {
    AfxMessageBox(_T("CreateProcess err!"));
    DWORD err = GetLastError();
    AfxMessageBox(CString(_T("err = %d"), err));
    return;
    }
    WaitForSingleObject(pt.hProcess, INFINITE);
    CloseHandle(pt.hProcess);
    CloseHandle(pt.hThread);
      

  4.   

    谢谢 kasdmn目前我这个进程是能开,但是想知道能在进程运行时候暂停这个进程的方法。
    看了好多网站,一直没有找到。难道真的像zzdmfk 说的,开了进程,要再去暂停他就不行了?我是这么理解的,有句柄,应该有什么方法去pending一个进程?关键是我没有这个exe的代码!郁闷~~~~~
    这个帖子在顶一下,看看是否有解。
      

  5.   

    要想暂停一个运行的进程,你必须暂停它的所有线程才行:
    首先要提升当前进程的权限为DEBUG, 以便它能查询别的进程的所有线程:
    bool EnableDebugPriv() 
    {
    BOOL                             bResult   =   TRUE;   
    HANDLE                         hToken;   
    TOKEN_PRIVILEGES     TokenPrivileges;    if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY   |   TOKEN_ADJUST_PRIVILEGES,&hToken)   ==   0)   
    {   
    printf("OpenProcessToken   Error:   %d\n",GetLastError());   
    bResult   =   FALSE;   
    }   
    TokenPrivileges.PrivilegeCount                       =   1;   
    TokenPrivileges.Privileges[0].Attributes   =  SE_PRIVILEGE_ENABLED  ;   
    LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);   
    AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);   
    if(GetLastError()   !=   ERROR_SUCCESS)   
    {   
    bResult   =   FALSE;   
    }   
    CloseHandle(hToken);   
    return bResult;}
    然后挂起目标进程中所有线程
    bool SuspendProcess(DWORD dwProcessID,HANDLE hProcess,FILE* pFile)
    {
    HANDLE hSnapshot;
    bool bExist;
    bool bResult=true;
    HANDLE hThread;
    THREADENTRY32 ThreadEntry32;
    hSnapshot   =   CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);   
    if(hSnapshot   !=   INVALID_HANDLE_VALUE)   
    {   
    ThreadEntry32.dwSize   =   sizeof(THREADENTRY32);                       
    bExist   =   Thread32First(hSnapshot,&ThreadEntry32);   
    while(bExist   =   Thread32Next(hSnapshot,&ThreadEntry32))   
    {   
    if(ThreadEntry32.th32OwnerProcessID   ==   dwProcessID)   
    {   
    hThread   =   OpenThread(THREAD_SUSPEND_RESUME,FALSE,ThreadEntry32.th32ThreadID);   
    if(hThread   !=   NULL)   
    {   
    fprintf(pFile,"Thread ID:%d\n",ThreadEntry32.th32ThreadID);
    SuspendThread(hThread);   
    CloseHandle(hThread);   

    else
    { bResult   =   false;   
    printf("Get next thread info failed\n");
    break;
    } }   
    }
    CloseHandle(hSnapshot);
    }   
    else   
    {   
    bResult   =   false;   
    printf("Get thread snap shot failed\n");
    }   
    return bResult;
    }
      

  6.   

    SuspendProcess中第一个参数是目标进程的ID,第二参数是目标进程的句柄