用createproess可以开一个进程去打开一个执行程序,但如何用线程去打开
一个执行程序呢?

解决方案 »

  1.   

    先createthread,然后在线程里打开就是了
      

  2.   

    不行
    打开的可执行程序,本身就是调用CreateProcess这个进程的子进程。
    每个可执行程序一旦load到内存里,都会创建一个进程,同时该进程创建一个主线程。
    可以在调用程序中 开辟一个线程,在这个线程中再去调用CreateProcess打开另一个可执行程序,但是,被打开的这个可执行程序,依然在内存中是一个进程的形式,同时拥有一个活泼的可被调度的主线程。
      

  3.   

    行,比如在程序里打IE,OutLook等。
      

  4.   


    //线程函数
    UINT ThreadProc(LPVOID param)
    {
    ::ShellExecute(NULL, "OPEN", "iexplore.exe",NULL,NULL, SW_SHOW );
    return 0;
    }//开启线程
    AfxBeginThread( ThreadProc, this);
      

  5.   

    谢谢楼上的兄弟ShangMuMu(想挣颗星星) ,我自己实验出下面这样办法来实现:AfxBeginThread(glStartProc,NULL);BOOL bCreate=CreateProcess(NULL,
      "C:\\test.exe", //运行程序名
      NULL,
               NULL,
               FALSE,
               NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
               NULL,
               NULL,
               &si,
               &pi);if(!bCreate)
    {
    AfxMessageBox("程序打开错误!");
    }
      

  6.   

    可以是可以,但是windows还是创建了一个新进程。
      

  7.   

    用这种方式打开一个进程后可以得到它的句柄,但怎么用TerminateProcess不能关闭该进程?
    奇怪..
      

  8.   

    TerninateProcess要求的句柄是要有PROCESS_TERMINATE权限的。没有这个权限,自然中止不了。
      

  9.   

    找到问题了,是我取句柄的方法不对。
    其实从createprocess中可直接取到句柄,现贴出来大家共同学习。。PROCESS_INFORMATION pi;
    BOOL bCreate=CreateProcess(NULL,
      "c:\\test.exe", //运行程序名
      NULL,
               NULL,
               FALSE,
               NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
               NULL,
               NULL,
               &si,
               &pi);
    hTest = pi.hProcess;::TerminateProcess(hTest,0);