CreateProcess传递参数到_tWinMain
⽤CreateProcess创建的⼦进程所获得的命令⾏参数有以下⼏种情况:
1.⼦进程中,WinMain函数的第三个参数lpCmdLine表⽰的命令⾏参数中除去应⽤程序路径、⽂件名以及与参数相隔的空格等字符串后的内容。⽐如
⽗进程:
CreateProcess(NULL, “c:// -p“, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
⼦进程中,lpCmdLine参数为-p,注意没有双引号
2.如果通过lpCmdLine参数查看命令⾏参数,那么⽗进程创建⼦进程的时候,需要在⼦程序和参数中加上空格号。⽐如:
⽗进程:
CreateProcess(“c://”,“ -p“, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
⼦进程中,lpCmdLine参数为-p,没有空格了。
3.如果想获得⼦进程的完整命令⾏参数,调⽤GetCommandLine函数。通常通过GetCommandLine函数获得的命令⾏参数,是⽗进程调⽤时的完整参数。
CreateProcess(NULL, “c:// -p“, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
⼦进程中,GetCommandLine返回的参数为c:// -p,注意没有双引号
以下情况都是调⽤GetCommandLine函数获得命令⾏参数
4.CreateProcess第⼀个参数是NULL,第⼆个参数指定⼦应⽤程序和命令⾏参数,那么⼦进程的命令⾏参数是第⼆个参数,不带双引号。⽐如:
⽗进程:
CreateProcess(NULL, “c:// -p“, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
⼦进程中,GetCommandLine获得的命令⾏参数为c:// -p
5.CreateProcess第⼀个参数指定⼦应⽤程序路径和⽂件名,第⼆个参数为NULL,那么⼦进程的命令⾏参数是第⼀个参数,带双引号。⽐如:
⽗进程:
CreateProcess(“c://“, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
⼦进程中,GetCommandLine获得的命令⾏参数为”c://“
6.CreateProcess第⼀个参数指定⼦应⽤程序路径和⽂件名,第⼆个参数为传递给⼦进程的参数,那么⼦进程的命令⾏参数是第⼆个参数,不带双引号。⽐如:
⽗进程:
CreateProcess(“c://“, ”-p“, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
⼦进程中,GetCommandLine获得的命令⾏参数为-p。
此处注意同第⼆点⽐较,如果⽤lpCmdLine查看命令⾏参数,没什么都没有。但是将”-p”改成” -p”,⽤可以看到参数是-p,是不是很混乱?
CreateProcess() 创建 32 位进程时的⾏为
CreateProcess() 不会强制实施 ANSI 规范的参数传递给 16-位应⽤程序。这将引发的⽅式 CreateProc
ess 从⼀个应⽤程序到下⼀个应⽤程序的⼯作并要求您知道您⽣成的应⽤程序是 16 位或 32 位的可执⾏⽂件之间不⼀致可能令⼈困惑的问题。若要进⼀步使问题变得复杂,CreateProcess 是在 Windows 95 和 Windows NT 中稍有不同实现。
createprocessaWindows NT ⾏为:
如果该 CommandLine 中的第⼀个"参数"并不完全 ApplicationName 字符串相同,然后它将替换它之前执⾏应⽤程序。例如,如果ApplicationName 和 CommandLine 参数,如下所⽰:
CreateProcess( "c://", "Param1 Param2 Param3", ...)
次要,应⽤程序可以看到该命令⾏参数如下所⽰:
argv[0] == "c:/"
argv[1] == "Param2"
argv[2] == "Param3"
Windows 95 ⾏为:
如果该 CommandLine 中的第⼀个"参数"并不完全 ApplicationName 字符串相同,CreateProcess 将失败并不到错误的⽂件。如此⼀来没有理由呈传递 NULL 作为要在 Windows 95,如果要执⾏⼀个 16 位应⽤程序中的 CreateProcess ApplicationName 参数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。