新手问题:我看某些程序里面通过CreateProcess创建进程,觉得有些不解。
普通的winmain函数在执行的时候,OS会自动给它创建进程和主线程,为什么要自己创建进程了,这个和运行时系统创建的进程有什么关系?

解决方案 »

  1.   

    有时候希望在自己的程序中启动一个外部的程序就要用CreateProcess啊。比如,你在对话框中有一个按钮,你希望一点这个按钮,QQ就运行了,那你就要用CreateProcess啊。这个和运行时系统创建的进程有什么关系?
    =================
    最大的不同应该是父进程不同吧。
      

  2.   

    通过CreateProcess创建进程可以得到进程句柄从而施行控制
      

  3.   

     如果什么都是系统去执行的,不用CreateProcess,你程序怎么自动执行一个新进程呢?
      

  4.   


    OS也是调用CreateProcess创建进程。
      

  5.   

    貌似听说createprocess会有内存泄露问题,要用_beginthreadex?
      

  6.   


    _beginthreadex还是调用createprocess,但做了一些初始化的工作。
      

  7.   

    _beginthreadex 调用createprocess。
    CreateThread吧
      

  8.   

    楼上说的对, _beginthreadex调用CreateThreadCreateThread函数是用来创建线程的Windows函数。不过,如果你正在编写C/C++代码,决不应该调用CreateThread。相反,应该使用Visual  C++运行期库函数_beginthreadex。如果不使用Microsoft的Visual  C++编译器,你的编译器供应商有它自己的CreateThred替代函数。
      若要使多线程C和C++程序能够正确地运行,必须创建一个数据结构,并将它与使用C/C++运行期库函数的每个线程关联起来。当你调用C/C++运行期库时,这些函数必须知道查看调用线程的数据块,这样就不会对别的线程产生不良影响。
      1.每个线程均获得由C/C++运行期库的堆栈分配的自己的tiddata内存结构。
      2.传递给_beginthreadex的线程函数的地址保存在tiddata内存块中。传递给该函数的参数也保存在该数据块中。
      3._beginthreadex确实从内部调用CreateThread,因为这是操作系统了解如何创建新线程的唯一方法。
      4.当调用CreatetThread时,它被告知通过调用_threadstartex而不是pfnStartAddr来启动执行新线程。还有,传递给线程函数的参数是tiddata结构而不是pvParam的地址。
      5.如果一切顺利,就会像CreateThread那样返回线程句柄。如果任何操作失败了,便返回NULL。
      _beginthreadex和_beginthread函数的区别。_beginthread函数的参数比较少,因此比特性全面的_beginthreadex函数受到更大的限制。
      例如,如果使用_beginthread,就无法创建带有安全属性的新线程,无法创建暂停的线程,也无法获得线程的ID值。