我必须通过提供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 ) ;
答案 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,然后重试。