资源描述
一、system 2
(一)函数原型: 2
(二)函数说明 2
(三)源码示例 3
二、WinExec 3
(一)函数原型 3
(二)函数说明 4
1,UINT WinExec( 4
2,参数uCmdShow可能的取值为 : 4
3,返回值 4
4,注意 5
5,示例程序 5
三、ShellExecute 5
(一)函数原型 5
1,功能: 6
2,示例; 6
(二)函数说明 6
1,参数说明 6
2,返回值 7
3,特殊用法 7
四、CreateProcess 9
(一)函数原型: 9
(二)参数: 9
0,参数简介 9
1, lpApplicationName: 10
2, lpCommandLine 11
3, lpProcessAttributes: 11
4, lpThreadAttributes: 12
5.,bInheritHandles: 12
6, dwCreationFlags: 12
6, lpEnvironment: 15
7, CurrentDirectory: 15
8, lpStartupInfo: 16
9, lpProcessInformation: 17
(三) 返回值: 17
(四)注释: 17
(五)其它应用(还未试成) 20
1、打开指定的URL 20
2、打开指定的文件夹 20
3、打开帮助文件 20
4、小结 20
(六)源码示例: 20
五、小结 24
一、system
(一)函数原型:
int system(const char * string)
1,功 能: 发出一个DOS命令
2,头文件stdlib.h
3,示例:
第一种:system("cd c:\\windows");
system("mk aaa");
第二种:system("mk c:\\windows\\aaa");
第三种: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 <stdlib.h>
#include <iostream.h>
int main(void)
{
cout<<"About to spawn and run a DOS command\n";
char strCMD[]="dir";
int i=system(strCMD);
cout<<i<<endl;
return 0;
}
二、WinExec
(一)函数原型
UINT WINAPI WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
1, 功能:执行一个Dos命令
2, 头文件:在Console环境中, 加上#include <windows.h>,其它不加
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_SHOWNORMAL}
SW_SHOWMINIMIZED = 2; {最小化, 激活}
SW_SHOWMAXIMIZED = 3; {最大化, 激活}
SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活}
SW_SHOW = 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE = 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}
SW_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 <stdlib.h>
#include <iostream.h>
#include <windows.h>
int main(void)
{
int i=WinExec("net user",SW_SHOWMAXIMIZED);
cout<<i<<endl;
return 0;
}
三、ShellExecute
(一)函数原型
HINSTANCE ShellExecute(
HWND hwnd, //父窗口句柄,如:NULL,Handle等)
LPCTSTR lpOperation, //打开方式,如:"open")*要加英文双引号
LPCTSTR lpFile, //要进行操作的文件或路径
LPCTSTR lpParameters, //通常设为NULL
//但是,当lpOperation为“explore”时,指定要传递的参数,
LPCTSTR lpDirectory, //指定默认目录,通常设为NULL
INT 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", " 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:who@", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。
格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文
如:ShellExecute(handle, ‘open’, "mailto:who@?subject=Hello&Body=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);
四、CreateProcess
——WIN32 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就会恢
展开阅读全文