如下代码---------------------------------------------------------
    if (!CreateProcess(NULL, "child.exe",
                       NULL, NULL,
                       TRUE, CREATE_NEW_CONSOLE, envp, NULL,
                       &startup_info,
                       &proc_info) ) {
        printf("CreateProcess failed! Error = %d\n", GetLastError());
        exit(1);
    }
---------------------------------------------------------
参数envp是我们malloc的一个地址,并填充一些环境变量。如果envp所指向的环境变量块的大小小于32K(左右),CreateProcess函数将会被成功执行。但是如果块的大小大于32K(大得不多),CreateProcess就会出错,错误码234,如果块的大小比32K大得多一点,CreateProcess也会出错,错误码是87。但是如果我通过继承环境变量块的方式来创建子进程,父进程有很大的环境变量块CreateProcess也不会出错。我想请问大家,为什么用malloc的环境变量块就会出错呢?刚到msdn的网上查了一下,也没发现有什么资料。希望大家能帮帮我。

解决方案 »

  1.   

    Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for the last string, two more to terminate the block.
      

  2.   

    Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for the last string, two more to terminate the block. 
      

  3.   

    看看是不是结尾字符不是用两个零结束的,unicode是用4个零结束的.
    234表示MORE_DATA_AVAILABLE,更多数据可用,应该是这个问题.
      

  4.   

    我用的环境变量块的格式是正确的。
    代码如下:#include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>int main(int argc, char *argv[]) 

        PROCESS_INFORMATION proc_info;
        DWORD exitcode;
        SECURITY_ATTRIBUTES saAttr; 
        STARTUPINFO startup_info;
        int wait_status;
        char *envp;
        int i;
        char *p;
     
        envp = (char *)malloc(1024 * 1024);
        if (NULL == envp) {
            printf("malloc error\n");
            exit(1);
        }
        p = envp;
        for (i = 0; i < 31; i++) {
            sprintf(p, "a%d=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", i);
            p += strlen(p) + 1;
        }
        *p = 0;    /* Set the bInheritHandle flag so the file handle are inherited. */
        saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
        saAttr.bInheritHandle = TRUE; 
        saAttr.lpSecurityDescriptor = NULL;     GetStartupInfo(&startup_info);    if (!CreateProcess(NULL, "child.exe",
                           NULL, NULL,
                           TRUE, CREATE_NEW_CONSOLE, envp, NULL,
                           &startup_info,
                           &proc_info) ) {
            printf("CreateProcess failed! Error = %d\n", GetLastError());
            exit(1);
        }    wait_status = WaitForSingleObject(proc_info.hProcess, INFINITE);
        if (WAIT_OBJECT_0 == wait_status) {
            GetExitCodeProcess(proc_info.hProcess, &exitcode);
            printf("Child's exitcode = %d\n", exitcode);
        } else {
            printf("Wait failed. Error = %d\n", GetLastError());
        }    printf("Parent is over!\n");    exit(0);
    }
      

  5.   

    我发现,环境变量块的大小只能是30720(30K,包括结尾的两个NULL字符),超过30720,CreateProcess函数就会出错。
    是微软的限制,还是??
      

  6.   

    到microsoft's forum问下,里面会有开发人员回答你的问题
    http://forums.microsoft.com
      

  7.   

    该问题已经解决。
    我向微软的MSDN维护人员发去一封信,告知他们这个问题。
    目前MSDN已经被修改,在CreateProcess (ASCII)页上已经加上了32K的限制。
    感谢大家的帮助。