新手问题:我看某些程序里面通过CreateProcess创建进程,觉得有些不解。
普通的winmain函数在执行的时候,OS会自动给它创建进程和主线程,为什么要自己创建进程了,这个和运行时系统创建的进程有什么关系?
普通的winmain函数在执行的时候,OS会自动给它创建进程和主线程,为什么要自己创建进程了,这个和运行时系统创建的进程有什么关系?
解决方案 »
- 代理问题
- 实现CListCtrl垂直滚动条下拉。。。
- 有没有办法把TrueType字体信息嵌入到我的程序中?
- 我用menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");增加一个菜单项,为什么不能用WM_CLOSE消息
- 控制台如何检测键盘缓冲区中是否有数据?
- 关于多线程编程
- 求ole2高级编程技术
- [求助][VC++] 有关 assert() 的错误
- 郁闷啊!上不了网啊!
- 请问如何在其他类的成员函数中实现刷新视图的操作?
- 如何在主对话框获取子对话框上控件的值?
- 帮忙 “Run-Time Check Failure #2 - Stack around the variable 'bmpinfo' was corrupted.”
=================
最大的不同应该是父进程不同吧。
OS也是调用CreateProcess创建进程。
_beginthreadex还是调用createprocess,但做了一些初始化的工作。
CreateThread吧
若要使多线程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值。