所以,代码我不能改变调用可执行文件,我需要给它不同的命令行args而不是黑盒子代码调用。我想我可以将可执行文件作为代理。 proc.exe
位于黑匣子部分所期望的位置,获取命令行参数,修改它们,然后调用原始文件procReal.exe
。
不幸的是,CreateProcess似乎无法启动,返回状态183.我已经查找了所有我能做到的事情并且无法找到很多相关信息。尝试过翻转,将句柄继承设置为true,手动指定工作目录,而不是执行其中任何一项操作。没运气。我以为有一些事情在这里的继承调用应用程序的适当的安全上下文,因此包装工作作为一个适当的直通,但我无法弄清楚如何做到这一点...
下面的代码,不相关的部分被修剪。
编辑请求后将完整代码放在此处。这已经没有任何意义了。现在它将部分有效,但前提是fopen
的{{1}}部分不存在。甚至没有移除fprintf,特别是整个部分必须被删除。
我试图回应每个人的评论,我认为我已经排除了大部分这些问题作为一个问题,但我留下了当前的异常行为。我能读到的更多内容表明,某些形式的复制字符串会导致内存溢出,这是否可能?
traceFile
答案 0 :(得分:3)
最明显的问题是你不能说(path+procName).c_str()
,因为它构建的临时字符串对象会立即被丢弃,使返回的指针无效。 我也非常怀疑假设 vector
的元素必然是连续的。
更正的字符串处理代码应如下所示:
string passedValue(procName); // First element of command line MUST be module name
...
const string exeModuleString(path + procName);
const LPCTSTR exeModule = exeModuleString.c_str();
LPTSTR exeArgs = new char[passedValue.size() + 1];
passedValue.copy(exeArgs, passedValue.size());
exeArgs[passedValue.size()] = '\0';
(这可能不是 最佳方式;我不经常使用C ++。但它应该正常工作。)
更正的错误处理代码,确保最后的错误代码立即,应该如下所示:
{
DWORD err = GetLastError();
FILE* myfile;
myfile = fopen ((path+"error.txt").c_str(), "w");
fprintf(myfile, "CreateProcess failed (%d).\n", int(err));
fclose(myfile);
}
您的代码报告了错误的错误代码,因为调用fopen()会更改它。 (当创建一个覆盖现有文件的新文件时,最后一个错误代码设置为ERROR_ALREADY_EXISTS
。)
有两个更广泛的问题,在您的背景下可能或可能不重要。首先,您使用argv []为新进程构建命令行;这意味着命令行解析(如Parsing C Command-Line Arguments中所述)将被应用两次(一次由您的进程执行,一次由子进程),如果命令行包含任何特殊字符(如引号或反斜杠),这可能会导致麻烦。理想情况下,在一般情况下,您可以调用GetCommandLine()。 (当然,这使得解析字符串以消除额外的参数相当困难。)
其次,您显然在ANSI模式下构建代码。如果命令行包含任何宽(" Unicode")字符,这可能会导致问题。人们普遍认为,最佳做法是始终以Unicode模式构建。您需要对代码进行的唯一重大更改是将string
替换为wstring
,因此它应该足够直接。
答案 1 :(得分:0)
我有同样的问题。 当我调用没有窗口的可执行文件时,问题似乎就出现了。 我找到了2个解决方案:
1。 创建一个名为thet exe的bat文件,后跟参数, 然后执行bat文件: CreateProcess(“temp.bat”,NULL,.... etc
2。 使用_spawnl