`

[转]STARTUPINFO解读--写得很详细

    博客分类:
  • MFC
阅读更多

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;           //请参见下一段和表4 - 7 的说明
   WORD wShowWindow;        //用于设定如果子应用程序初次调用的S h o w Wi n d o w 将S W _ S H O W D E FA U LT 作为
                              n C m d S h o w 参数传递时,该应用程序的第一个重叠窗口应该如何出现。
                              本成员可以是通常用于Show Wi n d o w 函数的任何一个S W _ *标识符
   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;
当Wi n d o w s 创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序仅仅使用默认值。至少应该将该结构中的所有成员初始化为零,然后将c b 成员设置为该结构的大小:
STARTUPINFO si = { sizeof(si) };
CreateProcess(...,&si,...);

表4-7 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              //强制在x 8 6 计算机上运行的控制台应用程序以全屏幕方式启动运行

另外还有两个标志,即STARTF_FORCEONFEEDBACK 和STARTF_+FORCEOFFF -EEDBACK ,当启动一个新进程时,它们可以用来控制鼠标的光标。由于Windows支持真正的多任务抢占式运行方式,因此可以启动一个应用程序,然后在进程初始化时,使用另一个程序。为了向用户提供直观的反馈信息,C r e a t e P r o c e s s 能够临时将系统的箭头光标改为一个新光标,即沙漏箭头光标:

该光标表示可以等待出现某种情况,也可以继续使用系统。当启动另一个进程时,CreateProcess函数使你能够更好地控制光标。当设定STARTF_FORCEONFEEDBACK标志时,C r e a t e P r o c e s s 并不将光标改为沙漏。

STARTF_FORCEONFEEDBACK可使CreateProcess能够监控新进程的初始化,并可根据结果来改变光标。当使用该标志来调用CreateProcess时,光标改为沙漏。过2 s 后,如果新进程没有调用G U I ,CreateProcess 将光标恢复为箭头。

如果该进程在2 s 内调用了GUI ,CreateProcess将等待该应用程序显示一个窗口。这必须在进程调用G U I 后5 s 内发生。如果没有显示窗口,CreateProcess就会恢复原来的光标。如果显示了一个窗口,CreateProcess将使沙漏光标继续保留5 s 。如果某个时候该应用程序调用了G e t M e s s a g e 函数,指明它完成了初始化,那么C r e a t e P r o c e s s 就会立即恢复原来的光标,并且停止监控新进程。

在结束这一节内容的介绍之前,我想讲一讲S TA RT U P I N F O 的w S h o w Wi n d o w 成员。你将该成员初始化为传递给( w ) Wi n M a i n 的最后一个参数n C m d S h o w 的值。该成员显示你想要传递给新进程的( w ) Wi n M a i n 函数的最后一个参数n C m d S h o w 的值。它是可以传递给S h o w Wi n d o w 函数的标识符之一。通常,n C m d S h o w 的值既可以是S W _ S H O W N O R M A L ,也可以是SW_ SHOWMINNOACTIVE 。但是,它有时可以是S W _ S H O W D E FA U LT 。

当在E x p l o r e r 中启动一个应用程序时,该应用程序的( w ) Wi n M a i n 函数被调用,而S W _ S H O W N O R M A L 则作为n C m d S h o w 参数来传递。如果为该应用程序创建了一个快捷方式,可以使用快捷方式的属性页来告诉系统,应用程序的窗口最初应该如何显示。图4 - 3 显示了运行N o t e p a d 的快捷方式的属性页。注意,使用R u n 选项的组合框,就能够设定如何显示N o t e p a d 的窗口。

当使用E x p l o r e r 来启动该快捷方式时,E x p l o r e r 会正确地准备S TA RT U P I N F O 结构并调用C r e a t e P r o c e s s 。这时N o t e p a d 开始运行,并且为n C m d S h o w 参数将S W _ S H O W M I N N O A C T I V E传递给它的( w ) Wi n M a i n 函数。

运用这样的方法,用户能够很容易地启动一个应用程序,其主窗口可以用正常状态、最小或最大状态进行显示。

最后,应用程序可以调用下面的函数,以便获取由父进程初始化的S TA RT U P I N F O 结构的拷贝。子进程可以查看该结构,并根据该结构的成员的值来改变它的行为特性。

VOID GetStartupInfo(LPSTARTUPINFO pStartupInfo);
注意虽然Wi n d o w s 文档没有明确地说明,但是在调用G e t S t a r t I n f o 函数之前,必须像下面这样对该结构的c b 成员进行初始化:
STARTUPINFO si = { sizeof(si) };
GetStartupInfo(&si);

分享到:
评论

相关推荐

    StartupInfo结构反调试.rar

    在"检查STARTUPINFO结构反调试.doc"文档中,可能详细介绍了如何利用`STARTUPINFO`结构中的某些信息来实施反调试策略。这可能包括检查`STARTUPINFO`结构是否被调试器篡改,或者利用其特性来触发特定行为,比如创建一...

    调用DOS返回结果的软件源码

    根据给定文件的信息,我们可以总结出以下详细的IT知识点: ### 1. 调用DOS命令并获取结果 在Windows环境下,通过编程的方式调用DOS命令并获取其执行结果是一项常见但实用的技术。本段代码展示了如何利用Visual ...

    操作系统上机报告.doc

    【实验原理】 首先由父进程创建子进程,让子进程创建一个文件并写入数据,子进程写文件过程中父 进程继续执行计算操作,等子进程执行完以后,父进程读取文件内容输出,实现进程协 同工作。 【实验程序及分析】 父...

    e语言-中文汇编易语言

     SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。 SW_SHOWMAXIMIZED:激活窗口并将其最大化。 SW_SHOWMINIMIZED:...

    利用管道重定向cmd输入输出源码

    本篇将详细介绍如何通过管道来重定向CMD命令行工具的输入输出。 #### 二、关键API函数解释 1. **CreateProcess**: - **功能**:用于启动一个新进程。 - **参数**: - `lpApplicationName`:应用程序的路径名。...

    vc调用gambit与FLUENT

    本文将详细介绍如何使用Visual C++(VC)来调用Gambit与FLUENT两个软件,并实现自动化处理流程。 #### Gambit与FLUENT简介 - **Gambit**:是Ansys公司提供的一款前处理器,主要用于创建和修改计算流体动力学(CFD)...

    在进程创建过程中使用ping命令

    本篇文章将详细探讨如何在进程创建过程中使用`ping`命令,以及与之相关的Windows API和进程管理知识。 `ping`命令主要用于测试网络连接的可达性和响应时间。它通过发送Internet控制消息协议(ICMP)的回显请求报文...

    精彩编程与编程技巧-如何判定VB调用的一个EXE程序已经结束....

    根据给定的信息,本文将详细解释如何在Visual Basic (VB) 中判断一个被调用的 EXE 文件是否已经结束执行。此技术对于那些需要在 VB 应用程序中调用外部程序并等待其完成的任务非常有用。 ### 如何判定VB调用的一个...

    CreateProcessWithPipe启动进程的软件源码

    下面将详细介绍各个关键API函数及其用法。 #### 重要API函数解析 1. **CreatePipe**:创建一个命名管道。 - 函数原型: ```vb Private Declare Function CreatePipe_ Lib "kernel32" ( _ phReadPipeAsLong, _ ...

    操作系统实验--进程的描述与控制.doc

    | lpStartupInfo | STARTUPINFO | STARTUPINFO 结构,包括新进程的输入和输出配置的详情 | | lpProcessInformation | LPPROCESS_INFORMATION | 调用的结果块;发送新应用程序的进程和主线程的句柄和 ID | 可以指定...

    Python subprocess模块详细解读

    7. **startupinfo, creationflags**:仅在Windows系统上使用,用于控制进程的启动方式。 创建`Popen`对象后,我们可以通过以下方法与子进程交互: 1. **Popen.pid**:返回子进程的进程ID。 2. **Popen.returncode*...

    操作系统实验题目

    读者-写者问题是多线程同步的经典问题,允许多个读者同时读取资源,但任何时刻只有一个写者能修改资源。使用信号量,可以设置一个读计数器,每次有读者进入时增加计数,写者则独占资源。MFC中的`CSemaphore`可以很好...

    selenium+python 去除启动的黑色cmd窗口方法.pdf

    本文将详细介绍如何通过修改Selenium源代码来去除这个启动的黑色CMD窗口。 首先,我们要理解Selenium是如何启动浏览器驱动的。Selenium使用Python的`subprocess`模块来执行驱动程序,如ChromeDriver或GeckoDriver。...

    易语言-CMD控制台重定向

    这些管道句柄在 [color=var(--theme-primary-base)]STARTUPINFO 结构中指定,使其成为子进程继承的标准句柄。父进程使用这两个管道的相对端来写入子进程的输入,并从子进程的输出中读取。 如 [color=var(--theme-...

    Delphi 自動刪除函數

    本文将详细介绍如何在Delphi中编写一个名为`DeleteMe`的自删除函数,并解释其工作原理。 ### 函数实现 #### 函数定义 ```pascal procedure DeleteMe; ``` 此函数不接受任何参数,也不返回任何值。它的作用是创建一...

    CMD控制台重定向-易语言

    这些管道句柄在 [color=var(--theme-primary-base)]STARTUPINFO  结构中指定,使其成为子进程继承的标准句柄。 父进程使用这两个管道的相对端来写入子进程的输入,并从子进程的输出中读取。 如 [color=var(--theme...

    以建立的用户身份运行外步程序的软件源码

    #### 描述:以建立的用户身份运行外部程序 VB 很实用的源码,精心挑选的精品源码 - 描述指出这是一段用 Visual Basic 编写的源码,能够实现以特定用户的身份来启动外部程序。 - 源码经过精心挑选,意味着它具有一定...

    计算机软件-商业源码-实例76 使用Delphi启动和关闭外部程序.zip

    FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_SHOWNORMAL; if CreateProcess(nil,...

    delphi Native_API

    - `JwaNtStatus.pas` 可能包含了Windows NT错误码和状态代码,这些在处理系统调用返回值时很有用。 - `JwaWinType.pas` 可能定义了一系列与Windows API交互所需的数据类型、常量和枚举。 使用这些Delphi单元,...

Global site tag (gtag.js) - Google Analytics