如下代码---------------------------------------------------------
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的网上查了一下,也没发现有什么资料。希望大家能帮帮我。
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的网上查了一下,也没发现有什么资料。希望大家能帮帮我。
234表示MORE_DATA_AVAILABLE,更多数据可用,应该是这个问题.
代码如下:#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);
}
是微软的限制,还是??
http://forums.microsoft.com
我向微软的MSDN维护人员发去一封信,告知他们这个问题。
目前MSDN已经被修改,在CreateProcess (ASCII)页上已经加上了32K的限制。
感谢大家的帮助。