




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、system2(一)函数原型:2(二)函数说明2(三)源码示例3二、WinExec3(一)函数原型3(二)函数说明41,UINT WinExec(42,参数uCmdShow可能的取值为 :43,返回值44,注意55,示例程序5三、ShellExecute5(一)函数原型51,功能:62,示例;6(二)函数说明61,参数说明62,返回值73,特殊用法7四、CreateProcess9(一)函数原型:9(二)参数:90,参数简介91, lpApplicationName:102, lpCommandLine113, lpProcessAttributes:114, lpThreadAttributes:125.,bInheritHandles:126, dwCreationFlags:126, lpEnvironment:157, CurrentDirectory:158, lpStartupInfo:169, lpProcessInformation:17(三) 返回值:17(四)注释:17(五)其它应用(还未试成)201、打开指定的URL202、打开指定的文件夹203、打开帮助文件204、小结20(六)源码示例:20五、小结24一、system(一)函数原型:int system(const char * string)1,功 能: 发出一个DOS命令 2,头文件stdlib.h3,示例:第一种:system(cd c:windows);system(mk aaa);第二种:system(mk c:windowsaaa);第三种:system(cd c:windows & mk aaa);/&这个符号与,把两条命令分别执行(二)函数说明system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。返回值=-1: 出现错误 =0: 调用成功但是没有出现子进程 0: 成功退出的子进程的id如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1,但是存在一个特殊情况,那就是:如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。若参数string为空指针(NULL),则返回非零值。在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。(三)源码示例#include #include int main(void) coutAbout to spawn and run a DOS commandn; char strCMD=dir;int i=system(strCMD); coutiendl;return 0; 二、WinExec(一)函数原型UINT WINAPI WinExec(LPCSTR lpCmdLine, UINT uCmdShow);1, 功能:执行一个Dos命令2, 头文件:在Console环境中, 加上#include ,其它不加3, 示例:比如你的程序路径为:F:123,名字是1.exe 需要的参数是123,就写成这样:WinExec(cmd.exe /k F:1.exe 123,SW_HIDE);(二)函数说明 1,UINT WinExec( LPCSTR lpCmdLine, /命令行,如没指定路径会按以下顺序查找: 程序目录/当前目录/System32/Windows/PATH环境变量 UINT uCmdShow /新启动程序显示方式 启动选项2,参数uCmdShow可能的取值为 :SW_HIDE = 0; 隐藏, 并且任务栏也没有最小化图标SW_SHOWNORMAL = 1; 用最近的大小和位置显示, 激活SW_NORMAL = 1; 同 SW_SHOWNORMALSW_SHOWMINIMIZED = 2; 最小化, 激活SW_SHOWMAXIMIZED = 3; 最大化, 激活SW_MAXIMIZE = 3; 同 SW_SHOWMAXIMIZEDSW_SHOWNOACTIVATE = 4; 用最近的大小和位置显示, 不激活SW_SHOW = 5; 同 SW_SHOWNORMALSW_MINIMIZE = 6; 最小化, 不激活SW_SHOWMINNOACTIVE = 7; 同 SW_MINIMIZESW_SHOWNA = 8; 同 SW_SHOWNOACTIVATESW_RESTORE = 9; 同 SW_SHOWNORMALSW_SHOWDEFAULT = 10; 同 SW_SHOWNORMALSW_MAX = 10; 同 SW_SHOWNORMAL返回值:3,返回值大于 31 调用成功等于 0 内存不足ERROR_FILE_NOT_FOUND = 2; 文件名错误ERROR_PATH_NOT_FOUND = 3; 路径名错误ERROR_BAD_FORMAT = 11; EXE 文件无效4,注意 (1)在Win32里,当新启动进程(started process)调用GetMessage 或超时后,WinExec()结束执行。为了避免等待,可尽早的调用GetMessage(2)WinExec能够带参数运行,但她的参数和程序在同一个字符串中,所以有一个局限性是,它不能运行路径中有空格的程序,例如,如果该程序在Program files下面,就不能正常运行5,示例程序#include #include #include int main(void) int i=WinExec(net user,SW_SHOWMAXIMIZED);coutiendl;return 0; 三、ShellExecute(一)函数原型HINSTANCE ShellExecute( HWND hwnd, /父窗口句柄,如:NULL,Handle等)LPCTSTR lpOperation, /打开方式,如:open)*要加英文双引号LPCTSTR lpFile, /要进行操作的文件或路径LPCTSTR lpParameters, /通常设为NULL/但是,当lpOperation为“explore”时,指定要传递的参数,LPCTSTR lpDirectory, /指定默认目录,通常设为NULLINT nShowCmd /文件打开的方式,以通常方式还是最大化或最小化显/示,一般为SW_SHOWNORMAL);1,功能:是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。2,示例;(1)调用计算器 ShellExecute(NULL,open,calc.exe,NULL,NULL,SW_SHOWNORMAL); (2打开记事本,并打开一个文件(系统能识别记事本应用程序的路径,因此我们不必使用绝对路径)ShellExecute(Handle, open, PChar(notepad), PChar(c:testreadme.txt), nil, SW_SHOW); (二)函数说明1,参数说明hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。 Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。 FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。 Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。 Directory:用于指定默认目录。 ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。 若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。 上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。 2,返回值返回的句柄不是一个真正的句柄.这个句柄唯一能做的就是把它转化为int型,把它跟32比较,大于32说明函数执行成功,否则就是一个错误代号3,特殊用法 (1) 打开相应的网址FileName参数设置为“http:”协议格式那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。 格式一:http:/网站域名。 如:ShellExecute(NULL, open, , NULL, NULL, SW_SHOWNORMAL);格式二:http:/网站域名/网页文件名。 如:ShellExecute(Handle, open, /default.htm,NULL,NULL, SW_SHOWNORMAL); (2) 发邮件如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。 格式一:mailto: 如:ShellExecute(Handle,open, mailto:, NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口。 格式二:mailto:用户账号邮件服务器地址 如:ShellExecute(Handle, open, mailto:, NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。 格式三:mailto:用户账号邮件服务器地址?subject=邮件主题body=邮件正文 如:ShellExecute(handle, open, mailto:?subject=HelloBody=This is a test, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符0a。(3)开始一个新的应用程序ShellExecute(Handle, open, PChar(c:testapp.exe), nil, nil, SW_SHOW); (4)打印一个文档ShellExecute(Handle, print, PChar(c:testtest.doc), nil, nil, SW_SHOW); 注意:可能你会看到word暂时的被打开,但它会自动关闭。 (5)你能通过一个已经注册的文件类型来打开应用程序ShellExecute(Handle, open, PChar(c:testreadme.txt), nil, nil, SW_SHOW); (6)用windows Explorer 打开一个目录ShellExecute(Handle, explore, PChar(c:windows), nil, nil, SW_SHOW); (7)运行一个DOS命令并立即返回ShellExecute(Handle, open, PChar(), PChar(/c copy file1.txt file2.txt), nil, SW_SHOW); (8)运行一个DOS命令并保持DOS窗口存在ShellExecute(Handle, open, PChar(), PChar(/k dir), nil, SW_SHOW); 四、CreateProcessWIN32 API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。(一)函数原型:BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );(二)参数:0,参数简介typedef struct _STARTUPINFO DWORD cb;/包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段. 应用程序必须将cb初始化为sizeof(STARTUPINFO) PSTR lpReserved; /保留。必须初始化为N U L L PSTR lpDesktop; /用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。 如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。 如果lpDesktop是NULL(这是最常见的情况),那么该进程将与当前桌面相关联 PSTR lpTitle; /用于设定控制台窗口的名称。如果l p Ti t l e 是N U L L ,则可执行文件的名字将用作窗口名 DWORD dwX;/用于设定应用程序窗口在屏幕上应该放置的位置的x 和y 坐标(以像素为单位)。 DWORD dwY;/只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时, 才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角 DWORD dwXSize; /用于设定应用程序窗口的宽度和长度(以像素为单位)只有dwYsize DWORD dwYSize; 当子进程将C W _ U S E D E FA U LT 用作C r e a t e Wi n d o w 的 n Wi d t h参数来创建它的第一个重叠窗口时,才使用这些值。 若是创建控制台窗口的应用程序,这些成员将用于指明控制台窗口的宽度 DWORD dwXCountChars; /用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位) DWORD dwYCountChars; DWORD dwFillAttribute; /用于设定子应用程序的控制台窗口使用的文本和背景颜色 DWORD dwFlags; /请参见上面的介绍 WORD wShowWindow; /用于设定如果子应用程序初次调用的S h o w Wi n d o w 将S W _ S H O W D E FA U LT 作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。本成员可以是SW_SHOWNORMAL ,也可以是SW_ SHOWMINNOACTIVE ,SW_SHOWDEFAULT,SW_HIDE。 WORD cbReserved2; /保留。必须被初始化为0 PBYTE lpReserved2; /保留。必须被初始化为N U L L HANDLE hStdInput; /用于设定供控制台输入和输出用的缓存的句柄。 按照默认设置,h S t d I n p u t 用于标识键盘缓存, h S t d O u t p u t 和h S t d E r r o r用于标识控制台窗口的缓存 HANDLE hStdOutput; HANDLE hStdError; STARTUPINFO, *LPSTARTUPINFO; 1, lpApplicationName:用来指定可执行模块的NULL结尾的字符串。可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数的最前面并由空格符与后面的字符分开。该模块可以是一个Win32应用程序。也可以是其他类型的模块(如MS-DOS 或 OS/2)。在Windows NT中,如果可执行模块是一个16位的应用程序,那么这个参数应该被设置为NULL并且应该在lpCommandLine参数中指定可执行模块的名称。16位的应用程序是以DOS虚拟机或Win32上的Windows(WOW) 为进程的方式运行。2, lpCommandLine(NULL结尾)指定要运行的命令行。可以为空,那么函数将使用参数指定的字符串当作要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。如果lpApplicationName参数为空,那么lpCommandLine中的第一个被空格分隔的要素指定可执行模块名。如果文件名不包含扩展名,那么.exe将被假定为默认的扩展名。如果文件名以一个点(.)结尾且没有扩展名,或文件名中包含路径,.exe将不会被加到后面。如果文件名中不包含路径,Windows将按照如下顺序寻找这个可执行文件:1).当前应用程序的目录。2).父进程的目录。3).Windows 95:Windows系统目录,可以使用GetSystemDirectory函数获得。Windows NT:32位Windows系统目录。可以使用GetSystemDirectory函数获得,目录名是SYSTEM32。4).在Windows NT中:16位Windows系统目录。不可以使用Win32函数获得这个目录,但是它会被搜索,目录名是SYSTEM。5).Windows目录。可以使用GetWindowsDirectory函数获得这个目录。6).列在PATH环境变量中的目录。如果被创建的进程是一个以MS-DOS或16位Windows为基础的应用程序,lpCommandLine参数应该是一个以可执行文件的文件名作为第一个要素的绝对路径,因为这样做可以使32位Windows程序工作的很好,这样设置lpCommandLine参数是最强壮的。3, lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。typedef struct _SECURITY_ATTRIBUTES DWORD nLength; /本结构体的大小sizeof(SECURITY_ATTRIBUTES) LPVOID lpSecurityDescriptor; /在Windows NT中:指定了新进程的安全描述符,如果参数为空,新进程/使用默认的安全描述符。在Windows Me/98/95中: lpSecurityDescriptor成员被忽略。BOOL bInheritHandle;/ 决定是否返回的句柄可以被子进程继承。 SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;4, lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子线程继承。如果lpThreadAttributes参数为空(NULL),那么句柄不能被继承。在Windows NT中,SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了主线程的安全描述符,如果参数为空,主线程使用默认的安全描述符。在Windows95中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员被忽略。5.,bInheritHandles:指示新进程是否从调用进程处继承了句柄。如果值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。6, dwCreationFlags:指定附加的、用来控制优先类以及还用来控制新进程的优先类,优先类用来决定此进程的线程调度的优先级(1)指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。1)值:CREATE_DEFAULT_ERROR_MODE含义:新进程不继承调用进程的错误模式。CreateProcess函数赋予新进程当前的默认错误模式作为替代。应用程序可以调用SetErrorMode函数设置当前的默认错误模式。这个标志对于那些运行在没有硬件错误环境下的多线程外壳程序是十分有用的。对于CreateProcess函数,默认的行为是为新进程继承调用者的错误模式。设置这个标志以改变默认的处理方式。2)值:CREATE_NEW_CONSOLE含义:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用。3)值:CREATE_NEW_PROCESS_GROUP含义:创建进程树的根进程。进程树种的全部进程都是根进程的子进程。新进程树的用户标识符与这个进程的标识符是相同的,由lpProcessInformation参数返回。进程树经常使用GenerateConsoleCtrlEvent函数允许发送CTRL+C或CTRL+BREAK信号到一组控制台进程。4)值:CREATE_SEPARATE_WOW_VDM含义:(只适用于Windows NT 且只有当运行16位的Windows应用程序时才是有效的)。如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;其他那些在不同VDM中运行的程序会继续正常的运行。同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。5)值:CREATE_SHARED_WOW_VDM含义:(只适用于Windows NT 且只有当运行16位的Windows应用程序时才是有效的)。如果WIN.INI中的Windows段的DefaultSeparateVDM选项被设置为真,这个标识使得CreateProcess函数越过这个选项并在共享的虚拟DOS机中运行新进程。6)值:CREATE_SUSPENDED含义:新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。7)值:CREATE_UNICODE_ENVIRONMENT含义:如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符。8)值:DEBUG_PROCESS含义:如果这个标志被设置,调用进程将被当作一个调试程序,并且新进程会被当作被调试的进程。系统把被调试程序发生的所有调试事件通知给调试器。如果你使用这个标志创建进程,只有调用进程(调用CreateProcess函数的进程)可以调用WaitForDebugEvent函数。9)值:DEBUG_ONLY_THIS_PROCESS含义:如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象。如果调用进程没有被调试,有关调试的行为就不会产生。10)值:DETACHED_PROCESS含义:对于控制台进程,新进程没有访问父进程控制台的权限。新进程可以通过AllocConsole函数自己创建一个新的控制台。这个标志不可以与CREATE_NEW_CONSOLE标志一起使用。(2)还用来控制新进程的优先类,优先类用来决定此进程的线程调度的优先级。如果下面的优先级类标志都没有被指定,那么默认的优先类是NORMAL_PRIORITY_CLASS,特殊情况是,如果被创建的进程是IDLE_PRIORITY_CLASS,那么,此情况下子进程的默认优先类是IDLE_PRIORITY_CLASS。可以下面的标志中的一个:1)优先级:HIGH_PRIORITY_CLASS 含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保证正确。这个优先级的程序优先于正常优先级或空闲优先级的程序。一个例子是Windows任务列表,为了保证当用户调用时可以立刻响应,放弃了对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优先级的CPU关联应用程序可以占用几乎全部的CPU可用时间。2)优先级:IDLE_PRIORITY_CLASS 含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断。例如屏幕保护程序。空闲优先级会被子进程继承。3)优先级:NORMAL_PRIORITY_CLASS 含义:指示这个进程没有特殊的任务调度要求。4)优先级:REALTIME_PRIORITY_CLASS 含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统进程。例如,一个执行时间稍长一点的实时进程可能导致磁盘缓存不足或鼠标反映迟钝。6, lpEnvironment:指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。每个字符串都是name=value的形式。因为相等标志被当作分隔符,所以它不能被环境变量当作变量名。与其使用应用程序提供的环境块,不如直接把这个参数设为空,系统驱动器上的当前目录信息不会被自动传递给新创建的进程。对于这个情况的探讨和如何处理,请参见注释一节。环境块可以包含Unicode或ANSI字符。如果lpEnvironment指向的环境块包含Unicode字符,那么dwCreationFlags字段的CREATE_UNICODE_ENVIRONMENT标志将被设置。如果块包含ANSI字符,该标志将被清空。请注意一个ANSI环境块是由两个零字节结束的:一个是字符串的结尾,另一个用来结束这个快。一个Unicode环境块石油四个零字节结束的:两个代表字符串结束,另两个用来结束块。7, CurrentDirectory:NULL结尾的字符串,用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。8, lpStartupInfo:(1)指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。当Wi n d o w s 创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序仅仅使用默认值。l 成员cb必须初始化为sizeof(STARTUPINFO),l 使用函数GetStartupInfo()使STARTINFO结构获得一个初始默认值,l 最后才,再根据需要设置少数其它几个参数,;(2)示例:STARTUPINFO si; si.cb = sizeof(STARTUPINFO);GetStartupInfo(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE;si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;(3)dwFlags 使用标志及含义标志 含义STARTF_USESIZE / 使用d w X S i z e 和d w Y S i z e 成员STARTF_USESHOWWINDOW /使用w S h o w Wi n d o w 成员STARTF_USEPOSITION /使用d w X 和d w Y 成员STARTF_USECOUNTCHARS /使用d w X C o u n t C h a r s 和dwYCount Chars 成员STARTF_USEFILLATTRIBUTE /使用d w F i l l A t t r i b u t e 成员STARTF_USESTDHANDLES /使用h S t d I n p u t 、h S t d O u t p u t 和h S t d E r r o r 成员STARTF_RUN_FULLSCREEN/强制在x86计算机上运行的控制台应用程序以全屏幕方式启动运行另外还有两个标志,即STARTF_FORCEONFEEDBACK和STARTF_FORCEOFFEEDBACK ,当启动一个新进程时,它们可以用来控制鼠标的光标。由于WINDOWS支持真正的多任务抢占式运行方式,因此可以启动一个应用程序,然后在进程初始化时,使用另一个程序。为了向用户提供直观的反馈信息,CreateProcess能够临时将系统的箭头光标改为一个新光标,即沙漏箭头光标:该光标表示可以等待出现某种情况,也可以继续使用系统。当启动另一个进程时,CreateProcess函数使你能够更好地控制光标。当设定STARTF_FORCEONFEEDBACK标志时,CreateProcess并不将光标改为沙漏,可使CreateProcess能够监控新进程的初始化,并可根据结果来改变光标。当使用该标志来调用CreateProcess时,光标改为沙漏。过2 s 后,如果新进程没有调用GUI,CreateProcess 将光标恢复为箭头。如果该进程在2 s 内调用了GUI ,CreateProcess将等待该应用程序显示一个窗口。这必须在进程调用GUI后5s 内发生。如果没有显示窗口,CreateProcess就会恢复原来的光标。如果显示了一个窗口,CreateProcess将使沙漏光标继续保留5 s 。如果某个时候该应用程序调用了GetMessage函数,指明它完成了初始化,那么CreateProcess就会立即恢复原来的光标,并且停止监控新进程。9, lpProcessInformation:指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。typedef struct _PROCESS_INFORMATION HANDLE hProcess; /存放每个对象的与进程相关的句柄 HANDLE hThread; /返回的线程句柄。 DWORD dwProcessId; /用来存放进程ID号 DWORD dwThreadId; /用来存放线程ID号 PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;(三) 返回值:如果函数执行成功,返回非零值。如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。(四)注释: 1,WinExec和LoadModule函数通过调用CreateProcess函数实现。 2,CreateProcess函数除了创建一个进程,还创建一个线程对象。这个线程将连同一个已初始化了的堆栈一起被创建,堆栈的大小由可执行文件的文件头中的描述决定。线程由文件头处开始执行。3,新进程和新线程的句柄被以全局访问权限创建。(1)如果没有安全描述符,那么句柄就可以在任何需要句柄类型作为参数的函数中被使用。(2)当提供安全描述符时,在接下来的时候当句柄被使用时,总是会先进行访问权限的检查,如果访问权限检查拒绝访问,请求的进程将不能使用这个句柄访问这个进程。4,调用进程可以通过WaitForInputIdle函数来等待新进程完成它的初始化并等待用户输入。这对于父进程和子进程之间的同步是极其有用的,因为CreateProcess函数不会等待新进程完成它的初始化工作。举例来说,在试图与新进程关联的窗口之前,进程应该先调用WaitForInputIdle。5,首选的结束一个进程的方式是调用ExitProcess函数,因为这个函数通知这个进程的所有动态链接库(DLLs)程序已进入结束状态。其他的结束进程的方法不会通知关联的动态链接库。注意当一个进程调用ExitProcess时,这个进程的其他县城没有机会运行其他任何代码(包括关联动态链接库的终止代码)。ExitProcess, ExitThread, CreateThread, CreateRemoteThread,当一个进程启动时(调用了CreateProcess的结果)是在进程中序列化进行的。在一段地址空间中,同一时间内这些事件中只有一个可以发生。这意味着下面的限制将保留:6,*在进程启动和DLL初始化阶段,新的线程可以被创建,但是直到进程的DLL初始化完成前它们都不能开始运行。*在DLL初始化或卸下例程中进程中只能有一个线程。*直到所有的线程都完成DLL初始化或卸下后,ExitProcess函数才返回。7,在进程中的所有线程都终止且进程所有的句柄和它们的线程被通过调用CloseHandle函数终止前,进程会留在系统中。进程和主线程的句柄都必须通过调用CloseHandle函数关闭。如果不再需要这些句柄,最好在创建进程后立刻关闭它们。8,当进程中最后一个线程终止时,下列的事件发生:*所有由进程打开的对象都会关闭。*进程的终止状态(由GetExitCodeProcess函数返回)从它的初始值STILL_ACTIVE变为最后一个结束的线程的结束状态。*主线程的线程对象被设置为标志状态,供其他等待这个对象的线程使用。*进程对象被设置为标志状态,供其他等待这个对象的线程使用。9,假设当前在C盘上的目录是MSVCMFC且有一个环境变量叫做C:,它的值是C:MSVCMFC,就像前面lpEnvironment中提到过的那样,这样的系统驱动器上的目录信息在CreateProcess函数的lpEnvironment参数不为空时不会被自动传递到新进程里。一个应用程序必须手动地把当前目录信息传递到新的进程中。为了这样做,应用程序必须直接创建环境字符串,并把它们按字母顺序排列(因为Windows NT和Windows 95使用一种简略的环境变量),并把它们放进lpEnvironment中指定的环境块中。类似的,他们要找到环境块的开头,又要重复一次前面提到的环境块的排序。10,一种获得驱动器X的当前目录变量的方法是调用GetFullPathName(x:,.)。这避免了一个应用程序必须去扫描环境块。如果返回的绝对路径是X:,就不需要把这个值当作一个环境数据去传递了,因为根目录是驱动器X上的新进程的默认当前目录。11,由CreateProcess函数返回的句柄对于进程对象具有PROCESS_ALL_ACCESS的访问权限。12,由lpcurrentDirectory参数指定的当前目录室子进程对象的当前目录。lpCommandLine参数指定的第二个项目是父进程的当前目录。13,对于Windows NT,当一个进程在指定了CREATE_NEW_PROCESS_GROUP的情况下被创建时,一个对于SetConsoleCtrlHandler(NULL,True)的调用被用在新的进程上,这意味着对新进程来说CTRL+C是无效的。这使得上层的外科程序可以自己处理CTRL+C信息并有选择的把这些信号传递给子进程。CTRL+BREAK依旧有效,并可被用来中断进程/进程树的执行。14,第一个参数lpApplicationName可能是空,这种情况下,可执行文件的名字必须在lpCommandLine中,lpCommandLine参数中可以包含空格。如果可执行文件或路径中包含空格,那么就会有执行不正确文件的风险,这是由于这个函数解析空格的方法引起的。例如:下边这个例子就很危险,因为它试图运行Program.exe文件,如果这个文件存在,它就会代替MyApp.exe文件的运行。CreateProcess(NULL,”C:Program FilesMyApp.exe”,.)如果有恶意的用户在系统编写了一个名为Program.exe的文件,那么任何调用CreateProcess函数,且在文件路径中使用Program Files文件夹的参数,都有可能会运行Program.exe文件,而不是运行本来打算运行的文件。要避免这个问题,可以不要将NULL值传递给lpApplicationName参数,或者在lpComma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中考历史总复习初中历史必考120个重点知识填空汇编
- 保安班组长培训
- 会议操作培训
- 车队运输安全合同协议
- 基本公共卫生培训课件
- 车辆垫资结清协议合同
- 小企业联保循环额度借款合同
- 办公室保洁服务合同
- 车架废铁采购合同协议
- 爸妈离婚协议书
- 《国父孙中山》课件
- 安全隐患报告和举报奖励制度
- 材料力学教学课件应力和应变分析、强度理论
- 2024年中国文联所属单位招聘考试真题
- 2025年高压电工作业考试国家总局题库及答案(共280题)
- 艺术机构培训章程范本
- 儿童哮喘降阶梯治疗
- 《成人心肺复苏术》课件
- 车间照明施工合同范例
- 硫酸安全使用管理及使用制度(4篇)
- 高教版2023年中职教科书《语文》(基础模块)下册教案全册
评论
0/150
提交评论