




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
应用程序都会有一个入口函数,它在程序运行时才被调用。因此,创建控制应用程序时,此入口函数将会是main。 int main(int argc,char* argv);操作系统实际上不是真调用main函数,而是去调用了C/C+运行期启动函数,此函数会初始化C/C+运行期库。因此,在程序中可以调用malloc和free之类函数。 如果,我们在控制台上省去了main函数,那么连接器将返回一个unresolved external symbol错误。 Win32程序启动过程,实际上是线程去调用一个CreateProcess函数的时候,系统会创建一个进程内核对象,其使用计数被初始化为1.此进程内核对象不是进程本身,仅仅是一个系统用来管理这个进程的小的数据结构。系统然后为新的进程创建一个虚拟地址空间,加载应用程序运行时所需要的代码和数据。 系统接着会为新进程创建一个主线程,这个主线程通过执行C/C+运行期启动代码开始运行,C/C+运行期启动代码又会调用main函数。如果系统能成功创建新的进程和进程的主线程,CreateProcess函数会返回TRUE,否则返回FALSE。 一般将创建进程称为父进程,被创建的进程称为子进程。系统在创建新的进程时会为新进程指定一个STARTUPINFO类型的变量,这个结构保护了父进程传递给子进程的一些显示信息。对图形界面应用程序来说,这些信息将影响新进程中主线程的主窗口显示:对控制台应用程序来说,如果有一个新的控制窗口被创建的话,这些信息将影响这个控制台窗口。STARTUPINFO结构定义如下。 typedef struct DWORD cb; / 本结构的长度,总是应该被设为 sizeof(STARTUPINFO) LPSTR lpReserved; / 保留(Reserve)字段,即程序不使用这个参数 LPSTR lpDesktop; / 指定桌面名称 LPSTR lpTitle; / 控制台应用程序使用,指定控制台窗口标题 DWORD dwX; / DWORD dwY; / DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; / 控制台程序使用,指定控制台窗口的行数 DWORD dwYCountChars; DWORD dwFillAttribute; /控制台程序使用,指定控制台窗口的背景色 DWORD dwFlags; / 标志。它的值决定了STARTUPINFO结构中哪些成员的值是有效的。 WORD wShowWindow; / 窗口的显示方式 WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; / 控制台程序使用,几个标准句柄 HANDLE hStdOutput; HANDLE hStdError; STARTUPINFO, *LPSTARTUPINFO; 一个进程可以调用GetStartupInfo函数来取得父进程创建自己时使用的STARTUPINFO结构。 事实上,Windows系统就是通过调用这个函数来取得当前进程的创建信息,以便对新进程中主窗口的属性设置默认值。 函数定义如下。 VOID GetStrtupInfo(LPSTARTUPINFO lpStartupInfo); / 取得当前进程被创建时指定的STARTUPINFO结构。 定义一个STARTUPINFO结构的对象以后,总要在使用此对象之前将对象的cb成员初始化为STARTUPINFO结构大小。 如下所示: STARTUPINFO si = sizeof(si); /将cb成员初始化为sizeof(si),其他成员初始化为0 :GetStrartupInfo(&si); 初始化cb成员这一步是必须的。因为随着WIndows版本的改变,API函数支持的结构体的成员有可能增加, 但又要兼容以前的版本,所以WIndows要通过结构体的大小来确定其成员的数目。 CreateProcess 函数 CreateProcess 函数创建一个新的进程和该进程的主线程。新的进程会在父进程的安全上下文中运行指定的可执行文件。 函数用法如下: CreateProcess( LPCSTR lpApplicationName, / 可执行文件的名称 LPCSTR lpCommandLine, / 指定了要传递执行模块的参数。 LPSECURITY_ATTRIBUTES lpProcessAttributes, / 进程安全性,值为NULL的话表示使用默认的安全属性。 LPSECURITY_ATTRIBUTES lpThreadAttributes, / 线程安全性,值为NULL的话表示使用默认的安全属性。 BOOL bInheritHandles, / 指定了当前进程中的可继承句柄是否可被新进程继承。 DWORD dwCreationFlags, / 指定了新进程的优先级以及其他创建标志 LPVOID lpCurrentDirectory, / 新进程使用的当前目录 LPSTARTUPINFO lpStartupInfo, / 指定新进程中窗口的位置、大小和标准句柄等。 LPPROCESS_INFORMATION lpProcessInformation / out 返回新进程的标志信息,如ID号、句柄等 ); lpApplicationName 和 lpCommandLine参数指定了新的进程将要使用的可执行文件的名称和传递给新进程的参数。 例如,下面代码了Windows自带的记事本程序。 STARTUPINFO si = sizdof(si); PROCESS_INFORMATION pi; char* szCommandLine=notepad; / 也可以是notepad.exe :CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi); 执行这段代码,Windows自带的记事本程序将被会被被打开。 lpCommandLine参数为新的进程指定了以一个完整命令行。 当CreateProcess函数复制此字符串的时候,它首先检查字符串中的第一个单词,病假设此单词是你想要运行的可执行 文件的名字。如果可执行文件名字中没有后缀,那么一个.exe后缀将被添加进来。 CreateProcess函数会按照以下路径去搜索可执行文件: (1)调用进程的可执行文件所在的目录。 (2)调用进程的当前目录。 (3)Windows的系统目录(System32目录) (5)在名称为PATH的环境变量中列出的目录。 当然,如果文件名种包含了目录的话,系统会直接在这个目录中查找可执行文件,而不会去再去其他目录中搜索你了。 如果系统找到了指定的可执行文件。它会创建一个新的进程并将该执行中的代码和数据映射到新进程的地址空间。 之后系统会调用C/C+运行期启动函数,这个函数检查新检查新进程的命令行,将文件名后第一个参数的地址传给新进程 的入口函数。 若将上述代码的第3行修改成了下面这样下面这样,则会看到给记事本进程传递参数后的效果。 char* szCommandLine=notepad ReadMe.txt; /指定了一个ReadMe.txt参数,将促使记事本打开此文件 再次运行程序,记事本进程打开后,还会试图打开父进程当前目录下的ReadMe.txt文件。 此时lpApplicationName参数为NULL,也可以再此参数中指定可执行文件的文件名。 注意必须为文件名指定后缀,系统不会自己假死文件名有一个.exe后缀的。 如果文件名不包含目录, 系统仅仅假设此文件在调用进程的当前目录下。 所以最常用的做法是将作此参数设为NULL dwCreationFlags 参数指定的标记会影响新的进程如何创建。 lpStartupInfo 参数是一个指向STARTUPINFO结构的指针。 lpProcessInformation 参数是一个指向PROCESS_INFORMATION 结构的指针。 CreateProcess函数在返回之前会初始化此结构的成员。 结构定义如下如下。 typedef struct HANDLE hProcess, /新建进程的内核句柄 HANDLE hThread: / 新建进程中主线程的内核句柄 DWORD dwProcessId; / 新建进程的ID DWORD dwThreadld; / 新建进程的主线程ID PROCESS_INFORMATION, *LPPROCESS_INFORMATION; 创建一个新的进程将促使系统创建一个进程内核对象和一个线程内核对象。 在创建它们的时候,系统会将每个对象使用计数初始化为1. 然后CreateProcess返回之前,这个函数打开此进程内核对象和线程内核对象的句柄,并将它们的值传给上述结构的 hProcess和hThread成员。 CreateProcess在内部打开这些对象的时候,对象的使用计数将会增加到2。 因此,父进程中必须有一个线程调用调用CloseHandle关闭CreateProcess函数返回的两个内核对象的句柄。 否则即便是子进程已经终止了,该进程的进程内涵对象和主线程的内核对象仍然没有释放。 当一个进程创建一个内核对象时,会分配一个ID。但是ID是可以被重用的。 当 第一个进程死亡后,它的ID号可能分配第二个进程.但是两个进程是互不相同的。 #include stdafx.h#include #include int main(int argc, char* argv)char szCommandLine = cmd;STARTUPINFO si = sizeof(si) ;PROCESS_INFORMATION pi;si.dwFlags = STARTF_USESHOWWINDOW; / 指定wShowWindow成员有效si.wShowWindow = TRUE; / 此成员设为TRUE的话则显示新建进程的主窗口, / 为FALSE的话则不显示BOOL bRet = :CreateProcess ( NULL, / 不在此指定可执行文件的文件名 szCommandLine, / 命令行参数 NULL, / 默认进程安全性 NULL, / 默认线程安全性 FALSE, / 指定当前进程内的句柄不可以被子进程继承 CREATE_NEW_CONSOLE, / 为新进程创建一个新的控制台窗口 NULL, / 使用本进程的环境变量 NULL, / 使用本进程的驱动器和目录 &si, &pi);if(bRet) / 既然我们不使用两个句柄,最好是立刻将它们关闭 :CloseHandle (pi.hThread); :CloseHandle (pi.hProcess); printf( 新进程的进程ID号:%d n, pi.dwProcessId); printf( 新进程的主线程ID号:%d n, pi.dwThreadId); return 0;CreateProcess 函数的第6个参数被设为CREATE_NEW_CONSOLE,意思是创建一个新的控制台。其在Winbase.h 中有如下定义。 #define CREATE_NEW_CONSOLE 0x00000010这个标识告诉Windows为新的进程创建一个新的控制台。 如果不使用这个标识,则新建进程就同父进程公用一个控制台。 不要以为CREATE_NEW_CONSOLE 这样的宏名长,不容易记忆。 实事上就是因为它长,所以表达的意思才明确,比单单记忆几个数字容易多了。 可以指定新创建进程的主窗口是否显示,如果需要隐藏则将相应代码改下如下。 si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = 0; dwFlags 成员指定了要使用STARTUPINFO 结构中的哪一个成员。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国工商业储能柜行业市场现状分析及竞争格局与投资发展研究报告
- 重症医学5C培训休克
- 2025-2030年高端葡萄酒行业市场深度分析及发展趋势与投资战略研究报告
- 2025-2030年电热水器行业市场深度分析及发展趋势与投资战略研究报告
- 2025-2030年中国绳夹行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国男性不育症的诊断与治疗行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国电器电源线行业市场现状供需分析及投资评估规划分析研究报告
- 云南工商学院《建筑设计基础2》2023-2024学年第二学期期末试卷
- 眉山药科职业学院《并行分布式计算》2023-2024学年第二学期期末试卷
- 佳木斯大学《信号与系统专业理论教学》2023-2024学年第二学期期末试卷
- 2025年安全教育培训考试题库(基础强化版)应急救援知识试题
- 2025年公民科学素质知识竞答考试题库资料500题(含答案)
- 第二节清洁消毒灭菌讲解
- 内蒙古赤峰历年中考语文现代文阅读之非连续性文本阅读7篇(截至2024年)
- 2023年普通高等学校招生全国统一考试新课标全国Ⅰ卷数学真题(解析版)
- 出厂试验大纲
- 应聘后勤园长简历
- 结构鉴定合同范例
- 《跨境电子商务基础》课件-国际市场调研内容
- 教育部《中小学校园食品安全和膳食经费管理工作指引》知识培训
- 【MOOC】大学生心理健康-厦门大学 中国大学慕课MOOC答案
评论
0/150
提交评论