C下执行命令行的方法

上传人:小** 文档编号:111070789 上传时间:2022-06-20 格式:DOC 页数:24 大小:182.50KB
返回 下载 相关 举报
C下执行命令行的方法_第1页
第1页 / 共24页
C下执行命令行的方法_第2页
第2页 / 共24页
C下执行命令行的方法_第3页
第3页 / 共24页
点击查看更多>>
资源描述
一、system。-执行shell命令1、包含头文件:#include2、定义intsystem(constchar*string);3、参数String:合法的可执行DOS(SHELL)命令4、返回值1) 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。2) 若参数string为空指针(NULL),则返回非零值。3) 如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功。5、说明system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程.在调用system()期间SIGCHLD信号会被暂时搁置,SIGINT和SIGQUIT信号则会被忽略。6、用例system(“ipconfig/all”);7、重定向标准输出流FILE*stream;stream=freopen(“data.txt”,”wb”,stdout);运行结果可以重定向到data.txt8、隐藏控制台窗口#pragmacomment(linker,“/subsystem:”windows”/entry:”mainCRTStartup”)仍有调用的DOS窗口一闪,且重定向失效。二、WinExec()运行可执行程序1、包含头文件#include2、定义UINTWinExec(LPCSTRlpCmdLine,UINTuCmdShow);3、参数IpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。/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_SHOWNORMAL4、返回值若函数调用成功,则返回值大于31。若函数调用失败,则返回值为下列之一:1) 0:系统内存或资源已耗尽。2) ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。3) ERROR_FILE_NOT_FOUND:指定的文件未找到。4) error_patH_noT_found:指定的路径未找到。5) 大于31调用成功6) 等于0内存不足7) ERROR_FILE_NOT_FOUND=2;文件名错误8) ERROR_pATH_NOT_FOUND=3;路径名错误9) ERROR_BAD_FORMAT=11;EXE文件无效5、用例WinExec(notepad.exe,SW_SHOW);运行计事本WinExec(cmd/cipconfig,SW_SHOW/运行命令行6、重定向标准输出流不同窗口,无法重定向7、隐藏控制台窗口#pragmaSW_HIDE窗口都隐藏。三、ShellExecute()运行文件1、包含头文件#include2、定义ShellExecute(hWnd:HWND;指定父窗口句柄Operation:pChar;指定动作,譬如:open、runas、print、edit、explore、find2FileName:pchar;指定要打开的文件或程序parameters:pchar;给要打开的程序指定参数;如果打开的是文件这里应该是nullDirectory:pchar;缺省目录ShowCmd:Integer打开选项):HINST;3、参数见上/ShowCmd参数可选值: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_SHOWNORMAL4、返回值执行成功会返回应用程序句柄返回的HINSTANCE可以将它转换为一个整数(d),并比较它的值大于还是小于32或比较它的错误代码返回值大于32表示执行成功返回值小于32表示执行错误返回值可能的错误有:=0内存不足ERROR_FILE_NOT_FOUND=2;文件名错误ERROR_PATH_NOT_FOUND=3;路径名错误ERROR_BAD_FORMAT=11;EXE文件无效SE_ERR_SHARE=26;发生共享错误SE_ERR_ASSOCINCOMPLETE=27;文件名不完全或无效SE_ERR_DDETIMEOUT=28;超时SE_ERR_DDEFAIL=29;DDE事务失败SE_ERR_DDEBUSY=30;正在处理其他DDE事务而不能完成该DDE事务SE_ERR_NOASSOC=31;没有相关联的应用程序5、说明ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。可打开可执行文件,也可打开已关联打开程序的文件。6、用例/调用计算器ShellExecute(NULL,”open”,”calc.exe”,NULL,NULL,SW_SHOWNORMAL);/调用记事本ShellExecute(NULL,”open”,”NOTEPAD.EXE”,NULL,NULL,SW_SHOWNORMAL);/执行命令行ShellExecute(NULL,”open”,”cmd.exe”,”/chelp”,NULL,SW_SHOW);7、标准输出流重定向无效,不是同一个窗口。8、隐藏控制台#pragmaSW_HIDE两个窗口均能隐藏,但重定向无效。四、CreateProcess()1、包含头文件#include2、定义BOOLCreateProcess(LPCTSTRlpApplicationName,LPTSTRlpCommandLine,LPSECURITY_ATTRIBUTESlpProcessAttributes。LPSECURITY_ATTRIBUTESlpThreadAttributes,BOOLbInheritHandles,DWORDdwCreationFlags,LPVOIDlpEnvironment,LPCTSTRlpCurrentDirectory,LPSTARTUPINFOlpStartupInfo,LPPROCESS_INFORMATIONlpProcessInformation);3、参数1)lpApplicationName指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于lpCommandLine参数最前面并由空格符与后面的字符分开2) lpCommandLine指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。3) lpProcessAttributes指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定返回的句柄是否可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。在WindowsNT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。4,lpThreadAttributes同IpProcessAttribute,不过这个参数决定的是线程是否被继承通常置为NULL.5,bInheritHandIes指示新进程是否从调用进程处继承了句柄。如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限6) dwCreationFlags指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。值:CREATE_DEFAULT_ERROR_MODE含义:新的进程不继承调用进程的错误模式。CreateProcess函数赋予新进程当前的默认错误模式作为替代。应用程序可以调用SetErrorMode函数设置当前的默认错误模式。这个标志对于那些运行在没有硬件错误环境下的多线程外壳程序是十分有用的。对于CreateProcess函数,默认的行为是为新进程继承调用者的错误模式。设置这个标志以改变默认的处理方式。值:CREATE_NEW_CONSOLE含义:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用。值:CREATE_NEW_PROCESS_GROUP含义:新进程将使一个进程树的根进程。进程树中的全部进程都是根进程的子进程。新进程树的用户标识符与这个进程的标识符是相同的,由lpProcessInformation参数返回。进程树经常使用GenerateConsoleCtrlEvent函数允许发送CTRL+C或CTRL+BREAK信号到一组控制台进程。值:CREATE_SEPARATE_WOW_VDM如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;其他那些在不同VDM中运行的程序会继续正常的运行。同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。(5)值:CREATE_SHARED_WOW_VDM如果WIN.INI中的Windows段的DefaultSeparateVDM选项被设置为真,这个标识使得CreateProcess函数越过这个选项并在共享的虚拟DOS机中运行新进程。值:CREATE_SUSPENDED含义:新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。值:CREATE_UNICODE_ENVIRONMENT含义:如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符。值:DEBUG_PROCESS含义:如果这个标志被设置,调用进程将被当做一个调试程序,并且新进程会被当做被调试的进程。系统把被调试程序发生的所有调试事件通知给调试器。如果你使用这个标志创建进程,只有调用进程(调用CreateProcess函数的进程)可以调用WaitForDebugEvent函数。(9)值:DEBUG_ONLY_THIS_PROCESS含义:如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象。如果调用进程没有被调试,有关调试的行为就不会产生。值:DETACHED_PROCESS含义:对于控制台进程,新进程没有访问父进程控制台的权限。新进程可以通过AllocConsole函数自己创建一个新的控制台。这个标志不可以与CREATE_NEW_CONSOLE标志一起使用。(11)值:CREATE_NO_WINDOW含义:系统不为新进程创建CUI窗口,使用该标志可以创建不含窗口的CUI程序。dwCreationFlags还用来控制新进程的优先类,优先类用来决定此进程的线程调度的优先级。如果下面的优先级类标志都没有被指定,那么默认的优先类是NORMAL_PRIORITY_CLASS,除非被创建的进程是IDLE_PRIORITY_CLASS。在这种情况下子进程的默认优先类是IDLE_PRIORITY_CLASS。可以选择下面的标志中的一个:优先级:HIGH_PRIORITY_CLASS含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保证正确。这个优先级的程序优先于正常优先级或空闲优先级的程序。一个例子是Windows任务列表,为了保证当用户调用时可以立刻响应,放弃了对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优先级的CPU关联应用程序可以占用几乎全部的CPU可用时间。优先级:IDLE_PRIORITY_CLASS含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断。例如屏幕保护程序。空闲优先级会被子进程继承。优先级:NORMAL_PRIORITY_CLASS含义:指示这个进程没有特殊的任务调度要求。优先级:REALTIME_PRIORITY_CLASS含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统进程。例如,一个执行时间稍长一点的实时进程可能导致磁盘缓存不足或鼠标反映迟钝。7) lpEnvironment指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。每个字符串都是name=value的形式。因为相等标志被当做分隔符,所以它不能被环境变量当做变量名与其使用应用程序提供的环境块,不如直接把这个参数设为空,系统驱动器上的当前目录信息不会被自动传递给新创建的进程。对于这个情况的探讨和如何处理,请参见注释一节。环境块可以包含Unicode或ANSI字符。如果lpEnvironment指向的环境块包含Unicode字符,那么dwCreationFlags字段的CREATE_UNICODE_ENWRONMENT标志将被设置。如果块包含ANSI字符,该标志将被清空。请注意一个ANSI环境块是由两个零字节结束的:一个是字符串的结尾,另一个用来结束这个快。一个Unicode环境块是由四个零字节结束的:两个代表字符串结束,另两个用来结束块。8) lpCurrentDirectory指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。9) lpStartupInfo指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。10) lpProcessInformation指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。4、返回值如果函数执行成功,返回非零值。如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。5、说明CreateProcess函数用来运行一个新程序WinExec和LoadModule函数依旧可用,但是它们同样通过调用CreateProcess函数实现。另外CreateProcess函数除了创建一个进程,还创建一个线程对象。这个线程将连同一个已初始化了的堆栈一起被创建,堆栈的大小由可执行文件的文件头中的描述决定。线程由文件头处开始执行。新进程和新线程的句柄被以全局访问权限创建。对于这两个句柄中的任一个,如果没有安全描述符,那么这个句柄就可以在任何需要句柄类型作为参数的函数中被使用。当提供安全描述符时,在接下来的时候当句柄被使用时,总是会先进行访问权限的检查,如果访问权限检查拒绝访问,请求的进程将不能使用这个句柄访问这个进程。这个进程会被分配给一个32位的进程标识符。直到进程中止这个标识符都是有效的。它可以被用来标识这个进程,或在OpenProcess函数中被指定以打开这个进程的句柄。进程中被初始化了的线程一样会被分配一个32位的线程标识符。这个标识符直到线程中止都是有效的且可以用来在系统中唯一标识这个线程。这些标识符在PROCESS_INFORMATION结构体中返回。当在lpApplicationName或lpCommandLine参数中指定应用程序名时,应用程序名中是否包含扩展名都不会影响运行,只有一种情况例外:一个以.com为扩展名的MS-DOS程序或Windows程序必须包含.com扩展名。调用进程可以通过WaitForInputIdle函数来等待新进程完成它的初始化并等待用户输入。这对于父进程和子进程之间的同步是极其有用的,因为CreateProcess函数不会等待新进程完成它的初始化工作。举例来说,在试图与新进程关联的窗口之前,进程应该先调用WaitForInputIdle。首选的结束一个进程的方式是调用ExitProcess函数,因为这个函数通知这个进程的所有动态链接库(DLLs)程序已进入结束状态。其他的结束进程的方法不会通知关联的动态链接库。注意当一个进程调用ExitProcess时,这个进程的其他线程没有机会运行其他任何代码(包括关联动态链接库的终止代码)。ExitProcess,ExitThread,CreateThread,CreateRemoteThread,当一个进程启动时(调用了CreateProcess的结果)是在进程中序列化进行的。在一段地址空间中,同一时间内这些事件中只有一个可以发生。这意味着下面的限制将保留:*在进程启动和DLL初始化阶段,新的线程可以被创建,但是直到进程的DLL初始化完成前它们都不能开始运行。*在DLL初始化或卸下例程中进程中只能有一个线程。*直到所有的线程都完成DLL初始化或卸下后,ExitProcess函数才返回。在进程中的所有线程都终止且进程所有的句柄和它们的线程被通过调用CloseHandle函数终止前,进程会留在系统中。进程和主线程的句柄都必须通过调用CloseHandle函数关闭。如果不再需要这些句柄,最好在创建进程后立刻关闭它们。当进程中最后一个线程终止时,下列的事件发生:*所有由进程打开的对象都会关闭。*进程的终止状态(由GetExitCodeProcess函数返回)从它的初始值STILL_ACTWE变为最后一个结束的线程的结束状态。*主线程的线程对象被设置为标志状态,供其他等待这个对象的线程使用。*进程对象被设置为标志状态,供其他等待这个对象的线程使用。假设当前在C盘上的目录是MSVCMFC且有一个环境变量叫做C:,它的值是C:MSVCMFC,就像前面lpEnvironment中提到过的那样,这样的系统驱动器上的目录信息在CreateProcess函数的lpEnvironment参数不为空时不会被自动传递到新进程里。一个应用程序必须手动地把当前目录信息传递到新的进程中。为了这样做,应用程序必须直接创建环境字符串,并把它们按字母顺序排列(因为WindowsNT和Windows95使用一种简略的环境变量),并把它们放进lpEnvironment中指定的环境块中。类似的,他们要找到环境块的开头,又要重复一次前面提到的环境块的排序。一种获得驱动器X的当前目录变量的方法是调用GetFullPathName(x:,.)。这避免了一个应用程序必须去扫描环境块。如果返回的绝对路径是X:,就不需要把这个值当作一个环境数据去传递了,因为根目录是驱动器X上的新进程的默认当前目录。由CreateProcess函数返回的句柄对于进程对象具有PROCESS_ALL_ACCESS的访问权限。由lpcurrentDirectory参数指定的当前目录室子进程对象的当前目录。IpCommandLine参数指定的第二个项目是父进程的当前目录。对于WindowsNT,当一个进程在指定了CREATE_NEW_PROCESS_GROUP的情况下被创建时,一个对于SetConsoleCtrlHandler(NULL,True)的调用被用在新的进程上,这意味着对新进程来说CTRL+C是无效的。这使得上层的外科程序可以自己处理CTRL+C信息并有选择的把这些信号传递给子进程。CTRL+BREAK依旧有效,并可被用来中断进程/进程树的执行。6、安全注释第一个参数lpApplicationName可能是空,这种情况下,可执行文件的名字必须在lpCommandLine中,lpCommandLine参数中可以包含空格。如果可执行文件或路径中包含空格,那么就会有执行不正确文件的风险,这是由于这个函数解析空格的方法引起的。例如:下边这个例子就很危险,因为它试图运行Program.exe文件,如果这个文件存在,它就会代替MyApp.exe文件的运行。CreateProcess(NULL,”C:ProgramFilesMyApp.exe”,.)如果有恶意的用户在系统编写了一个名为Program.exe的文件,那么任何调用CreateProcess函数,且在文件路径中使用ProgramFiles文件夹的参数,都有可能会运行Program.exe文件,而不是运行本来打算运行的文件。要避免这个问题,可以不要将NULL值传递给lpApplicationName参数,或者在lpCommandLine中使用双引号(转义符)括起可执行文件的全路径名,如下所示:CreateProcess(NULL,”C:ProgramFilesMyApp.exe”-L-S”,.)-L和-S是MyApp.exe可执行文件的参数。最后要说明的一点是:在lpApplicationName中的参数和lpCommandLine中的第一个参数是一样的,有人说显得有些重复,其实这样做纯粹是一种被公认化了习惯!=0;7、用例STARTUPINFOStartupInfo=0=0;=FALSE;PROCESS_INFORMATIONProcessInfoBOOLbRetUINTuResult=0;TCHARCommandLineMAX_PATH=0TCHARAppNameMAX_PATHStartupInfo.cb=sizeof(STARTUPINFO);StartupInfo.wShowWindow=SW_SHOW;StartupInfo.dwFlags=STARTF_USESHOWWINDOW;uResult=GetSystemDirectory(AppName,MAX_PATH);=0;=0;=0;lstrcat(AppName,_T(cmd.exe);lstrcat(CommandLine,_T(/cdir);bRet=CreateProcess(AppName,CommandLine,NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcessInfo);if(ProcessInfo.hProcess)WaitForSingleObject(ProcessInfo.hProcess,INFINITE);if(ProcessInfo.hProcess)CloseHandle(ProcessInfo.hThread);if(ProcessInfo.hThread)CloseHandle(ProcessInfo.hProcess);8、重定向标准输出流利用管道技术实现父进程和子进程之间的通信,紫禁城将执行结果重定向写入管道,父进程读取内容即可。HANDLEhPipeRead=NULL;HANDLEhPipeWrite=NULL;BOOLbRes=FALSE;DWORDdwRead=0;DWORDdwAvail=0;CHARrdBuffer1400=0;SECURITY_ATTRIBUTESSecurityAttr=0;/创建匿名管道SecurityAttr.nLength=sizeof(SECURITY_ATTRIBUTES);SecurityAttr.lpSecurityDescriptor=NULL;SecurityAttr.bInheritHandle=TRUE;bRes=CreatePipe(&hPipeRead,&hPipeWrite,&SecurityAttr,0);/重定向StartupInfo的标准输出流和标准错误流StartupInfo.hStdOutput=hPipeWrite;StartupInfo.hStdError=hPipeWrite;/启用标准输入输出流StartupInfo.dwFlagsSTARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;/进程创建后,读取管道的内容即可bRet=ReadFile(hPipeRead,rdBuffer,1024,&dwRead,NULL);后续可在rdBuffer读取命令执行结果9、隐藏控制台窗口只需在Startupinfo里设置窗口属性为隐藏即可StartupInfo.wShowWindow=SW_HIDE;附录1、STARTUPINFO结构1)定义typedefstruct_STARTUPINFODWORDcb;LPTSTRlpReserved;LPTSTRlpDesktop;LPTSTRlpTitle;DWORDdwX;DWORDdwY;DWORDdwXSize;DWORDdwYSize;DWORDdwXCountChars;DWORDdwYCountChars;DWORDdwFillAttribute;DWORDdwFlags;WORDwShowWindow;WORDcbReserved2;LPBYTElpReserved2;HANDLEhStdInput;HANDLEhStdOutput;HANDLEhStdError;STARTUPINFO,*LPSTARTUPINFO;2)参数STARTUPINFO结构该结构用于指定新进程的主窗口特性DWORDcb;/包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段.应用程序必须将cb初始化为sizeof(STARTUPINFO)PSTRlpReserved;/保留。必须初始化为NULLPSTRlpDesktop;/用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。如果IpDesktop是NULL(这是最常见的情况),那么该进程将与当前桌面相关联PSTRlpTitle;/用于设定控制台窗口的名称。如果lpTitle是NULL,则可执行文件的名字将用作窗口名DWORDdwX;/用于设定应用程序窗口在屏幕上应该放置的位置的x和y坐标(以像素为单位)。DWORDdwY;只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角DWORDdwXSize;/用于设定应用程序窗口的宽度和长度(以像素为单位)只有dwYsizeDWORDdwYSize;当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来创建它的第一个重叠窗口时,才使用这些值。DWORDdwXCountChars;/用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位)DWORDdwYCountChars;DWORDdwFillAttribute;/用于设定子应用程序的控制台窗口使用的文本和背景颜色DWORDdwFlags;/请参见下一段和表4-7的说明WORDwShowWindow;/用于设定如果子应用程序初次调用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。本成员可以是通常用于ShowWindow函数的任何一个SW_*标识符WORDcbReserved2;/保留。必须被初始化为0PBYTElpReserved2;/保留。必须被初始化为NULLHANDLEhStdInput;/用于设定供控制台输入和输出用的缓存的句柄。按照默认设置,hStdInput用于标识键盘缓存,hStdOutput和hStdError用于标识控制台窗口的缓存HANDLEhStdOutput;HANDLEhStdError;当Windows创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序仅仅使用默认值。至少应该将该结构中的所有成员初始化为零,然后将cb成员设置为该结构的大小:STARTUPINFOsi=sizeof(si);CreateProcess(.,&si,.);表4-7dwFlags使用标志及含义标志含义STARTF_USESIZE/使用dwXSize和dwYSize成员STARTF_USESHOWWINDOW/使用wShowWindow成员STARTF_USEPOSITION/使用dwX和dwY成员STARTF_USECOUNTCHARS/使用dwXCountChars和dwYCountChars成员STARTF_USEFILLATTRIBUTE/使用dwFillAttribute成员STARTF_USESTDHANDLES/使用hStdInput、hStdOutput和hStdError成员STARTF_RUN_FULLSCREEN强制在x86计算机上运行的控制台应用程序以全屏幕方式启动运行另外还有两个标志,即STARTF_FORCEONFEEDBACK和STARTF_+FORCEOFFF-EEDBACK,当启动一个新进程时,它们可以用来控制鼠标的光标。由于Windows支持真正的多任务抢占式运行方式,因此可以启动一个应用程序,然后在进程初始化时,使用另一个程序。为了向用户提供直观的反馈信息,CreateProcess能够临时将系统的箭头光标改为一个新光标,即沙漏箭头光标:该光标表示可以等待出现某种情况,也可以继续使用系统。当启动另一个进程时,CreateProcess函数使你能够更好地控制光标。当设定STARTF_FORCEONFEEDBACK标志时,CreateProcess并不将光标改为沙漏。STARTF_FORCEONFEEDBACK可使CreateProcess能够监控新进程的初始化,并可根据结果来改变光标。当使用该标志来调用CreateProcess时,光标改为沙漏。过2s后,如果新进程没有调用GUI,CreateProcess将光标恢复为箭头。如果该进程在2s内调用了GUI,CreateProcess将等待该应用程序显示一个窗口。这必须在进程调用GUI后5s内发生。如果没有显示窗口,CreateProcess就会恢复原来的光标。如果显示了一个窗口,CreateProcess将使沙漏光标继续保留5s。如果某个时候该应用程序调用了GetMessage函数,指明它完成了初始化,那么CreateProcess就会立即恢复原来的光标,并且停止监控新进程。在结束这一节内容的介绍之前,我想讲一讲STARTUPINFO的wShowWindow成员。你将该成员初始化为传递给(w)WinMain的最后一个参数nCmdShow的值。该成员显示你想要传递给新进程的(w)WinMain函数的最后一个参数nCmdShow的值。它是可以传递给ShowWindow函数的标识符之一。通常,nCmdShow的值既可以是SW_SHOWNORMAL,也可以是SW_SHOWMINNOACTIVE。但是,它有时可以是SW_SHOWDEFAULT。当在Explorer中启动一个应用程序时,该应用程序的(w)WinMain函数被调用,而SW_SHOWNORMAL则作为nCmdShow参数来传递。如果为该应用程序创建了一个快捷方式,可以使用快捷方式的属性页来告诉系统,应用程序的窗口最初应该如何显示。图4-3显示了运行Notepad的快捷方式的属性页。注意,使用Run选项的组合框,就能够设定如何显示Notepad的窗口。当使用Explorer来启动该快捷方式时,Explorer会正确地准备STARTUPINFO结构并调用CreateProcess。这时Notepad开始运行,并且为nCmdShow参数将SW_SHOWMINNOACTIVE传递给它的(w)WinMain函数。运用这样的方法,用户能够很容易地启动一个应用程序,其主窗口可以用正常状态、最小或最大状态进行显示。最后,应用程序可以调用下面的函数,以便获取由父进程初始化的STARTUPINFO结构的拷贝。子进程可以查看该结构,并根据该结构的成员的值来改变它的行为特性。VOIDGetStartupInfo(LPSTARTUPINFOpStartupInfo);注意虽然Windows文档没有明确地说明,但是在调用GetStartInfo函数之前,必须像下面这样对该结构的cb成员进行初始化:STARTUPINFOsi=sizeof(si);GetStartupInfo(&si);2、PROCESS_INFORMATION结构1)定义typedefstruct_PROCESS_INFORMATIONHANDLEhProcess;HANDLEhThread;DWORDdwProcessId;DWORDdwThreadId;PROCESS_INFORMATION;2)参数 hProcess:返回新进程的句柄。 hThread:返回主线程的句柄。 dwProcessId:返回一个全局进程标识符。该标识符用于标识一个进程。从进程被创建到终止,该值始终有效。 dwThreadld:返回一个全局线程标识符。该标识符用于标识一个线程。从线程被创建到终止,该值始终有效。3、SECURITY_ATTRIBUTES结构1)定义typedefstruct_SECURITY_ATTRIBUTESDWORDnLength;LPVOIDlpSecurityDescriptor;BOOLbInheritHandle;SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES;2)参数 nLength:指定该结构大小。 IpSecurityDescriptor:指向一个对象的安全描述符,该安全描述符控制对象的共享。如果该成员置为NULL,则该对象使用调用进程的默认安全描述符。 blnheritHandle:指定新进程被创建时是否继承返回的句柄。若该成员置为TRUE,则新进程继承该句柄。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!