createprocess返回0,getlasterror设置为2

时间:2015-11-27 12:52:54

标签: c++ winapi

我必须通过提供jar文件路径来执行类文件.Below是我的程序, 但是,当getlasterror设置为2时,createprocess返回0。 尝试使用sysnative而不是system32仍然无法正常工作。 任何人都可以指出我在这里出了什么问题:

char *command;
char *cmdname = "c:\\windows\\system32\\cmd.exe /C ";
    char *p = " java -cp ";
    char *p1 = " com.ge.med.terra.eaaa.server.EA3Server %*";
   command = (char *)malloc(50);

    env = getenv("GEHC_SECURITY_HOME");
    strcpy(command, cmdname);
    strcat(command, "\"");
    strcat(command, p);
    strcat(command, "\"");
    strcat(command,env);
    strcat(command,"\\eat\\jar\\eat.jar\";");
    strcat(command, p1);
    strcat(command, "\"");

    result = CreateProcessA( NULL,   // No module name (use command line)
        command,        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi ) ;  

2 个答案:

答案 0 :(得分:0)

您使用c++标记了此问题。出于这个原因,我建议你使用C ++ std::string类。这样,您可以轻松地连接创建命令所需的字符串。它更简洁,更易于阅读,所有内存管理都由后台的类完成(不需要malloc),并且您不必担心终止字符串(可能不适用于此示例)但总的来说)。这是你如何做到的:

std::string command = "c:\\windows\\system32\\cmd.exe /C \" java -cp \"" + std::string(env)
    + "\\eat\\jar\\eat.jar\";\"";

result = CreateProcessA(NULL,   // No module name (use command line)
    command.c_str(),        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi);

答案 1 :(得分:0)

你溢出了你分配的缓冲区。你可以为50个字符分配空间,但你可以写入105加上GEHC_SECURITY_HOME中的任何内容。当发生这种情况时,您会写入其他一些已分配的块,这将产生未指定但不合需要的行为。

使用std :: string将消除此问题,但+运算符很慢。如果你关心性能,使用std :: stringstream会更好。但是要测试这是否是唯一的问题,你可以将你的50改为500,然后重试。