CreateProcess() 创建 32 位进程时的行为
例 1:如果将 ApplicationName 参数传递,并且 CommandLine 参数为 NULL 然后 ApplicationName 参数还用作该 CommandLine。 这并不意味着您可以将其他的命令行参数传递 ApplicationName 字符串中。例如对于下面的调用将失败,出现一个"找不到文件"错误:
CreateProcess( "c:\\MyApp.exe Param1 Param2", NULL, ... )
另一方面,如果 CommandLine 参数为非 NULL,并且 ApplicationName 参数为 NULL 然后 API 试图提取 CommandLine 参数中的应用程序的名称。
情况 3:
当您将有效的字符串的指针传递给 ApplicationName 和 CommandLine 这两个参数时,将产生 CreateProcess() 函数的灵活性 (和一个可能的混淆点)。这允许您指定要执行完整的命令行传递到应用程序以及为应用程序。一个可能假定传递到创建的应用程序的命令行是该 ApplicationName 和 CommandLine 参数的复合,但这不是这种情况。如此一来 CreateProcess 由创建一个进程可以接收其.exe 名称之外的其他值作为其"argv [0]"参数。以下是生成此"异常"行为的 CreateProcess 调用的一个示例:
CreateProcess( "c:\\MyApp.exe", "Param1 Param2 Param3", ...)
argv[0] == "Param1" argv[1] == "Param2" argv[2] == "Param3"
CreateProcess 执行在 16 位.exe 文件时的行为
CreateProcess() 不会强制实施 ANSI 规范的参数传递给 16-位应用程序。这将引发的方式 CreateProcess 从一个应用程序到下一个应用程序的工作并要求您知道您生成的应用程序是 16 位或 32 位的可执行文件之间不一致可能令人困惑的问题。若要进一步使问题变得复杂,CreateProcess 是在 Windows 95 和 Windows NT 中稍有不同实现。Windows NT 行为:
如果该 CommandLine 中的第一个"参数"并不完全 ApplicationName 字符串相同,然后它将替换它之前执行应用程序。例如,如果 ApplicationName 和 CommandLine 参数,如下所示:
CreateProcess( "c:\\MyApp16.exe", "Param1 Param2 Param3", ...)
argv[0] == "c:\MyApp16.exe" argv[1] == "Param2" argv[2] == "Param3"
如果该 CommandLine 中的第一个"参数"并不完全 ApplicationName 字符串相同,CreateProcess 将失败并找不到错误的文件。如此一来没有理由呈传递 NULL 作为要在 Windows 95,如果要执行一个 16 位应用程序中的 CreateProcess ApplicationName 参数。