永发信息网

C语言中CreatProcess函数参数问题!急!!!!

答案:3  悬赏:80  手机版
解决时间 2021-02-06 00:18
  • 提问者网友:听门外雪花风
  • 2021-02-05 15:06
我想用CreatProcess函数调用C盘目录下的test.exe程序,同时需要将test.exe的标准输入输出重定向到文件输入输出(输入重定向到in.txt,输出重定向到b.txt)。

请问CreatProcess的前两个参数如何确定?第一个参数似乎是“C://test.exe”,第二个命令行参数应该怎么写?
最佳答案
  • 五星知识达人网友:迟山
  • 2021-02-05 15:54
其实system函数执行之后,就会返回到你的程序了,这个函数是阻塞的。还有更灵活一些的,比如ShellExecuteEx,这个应该是非阻塞的,但是可以通过WaitForSingleObject使他变为阻塞。如果windows程序,也可以用CreatProcess()

那你看看是否可以使用exec和spawn两个函数族的函数。
system中的exe加载过程是由os完成的,system只不过把一条命令行传给了os,由os完成剩下的工作。
而exec和spawn是调用dos内核的4Bh功能自己加载一个子程序的,因此能够比较细致地控制加载的过程。MCB申请由4B功能完成,子程序的PSP重构以及JFT的继承由exec和spawn帮你做,而EVB块的内容可以通过它们提供的参数让用户指定。spawn好象还可以通过4Dh获得子程序的返回值(就是main的return值),是不是这样不太记得了。

如果是在windows下编程,建议还是用VC吧,比较有用。
全部回答
  • 1楼网友:人類模型
  • 2021-02-05 17:31
补充: 自己修改输出文件,要启动的控制台应用程序,每次检查是否有输出的时间间隔.最好改成带命令行参数的程序. 楼主,貌似用CreateProcess不行,看看我下面的代码 vc++6.0下编译运行测试通过 补充:"带命令行参数的程序"? 对本问题不起作用 输入问题很简单,再建立一个管道,把被创建进程的输入句柄替换为这个管道的输出句柄,具体程序我改天给出来 #include "windows.h" #include #define MAX_LENGTH 10240 int main() { FILE *f; PROCESS_INFORMATION ProcessInformation; SECURITY_ATTRIBUTES pipeattr; HANDLE hReadPipe, hWritePipe; STARTUPINFO si; unsigned long lBytesRead; char Buff[MAX_LENGTH]; int ret; f = fopen("c:\\result.txt", "w"); if (!f) { printf("create file error!\n"); return 1; } pipeattr.nLength = 12; pipeattr.lpSecurityDescriptor = 0; pipeattr.bInheritHandle = true; CreatePipe(&hReadPipe, &hWritePipe, &pipeattr, 0); ZeroMemory(&si, sizeof(si)); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdInput = NULL; si.hStdOutput = si.hStdError = hWritePipe; if (CreateProcess("c:\\ansic.exe", NULL, NULL, NULL, 1, 0, NULL, NULL, &si, &ProcessInformation)) { printf("create process successfully!\n"); } else { printf("create process error!\n"); return 1; } Sleep(1000); while (Sleep(10), PeekNamedPipe(hReadPipe, Buff, MAX_LENGTH, &lBytesRead, 0, 0), lBytesRead) if (lBytesRead) { ret = ReadFile(hReadPipe, Buff, lBytesRead, &lBytesRead, 0); fwrite(Buff, lBytesRead, 1, f); } fclose(f); return 1; }
  • 2楼网友:野慌
  • 2021-02-05 16:05
第一个参数是应用程序路径 第二个是应用程序执行命令 如果只调用不带参数的exe应用程序的情况下,第一个参数和第二个参数效果是一样的 举个例子: #include "stdafx.h" #include "windows.h" #include "stdio.h" int main(int argc, char* argv[]) { PROCESS_INFORMATION pi; STARTUPINFO si = {sizeof(si)}; // 填充数组 char buf[] = "C:\\test.exe"; // 记录文件路径 BOOL res = ::CreateProcess(NULL,buf,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); //或CreateProcess(buf,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); if(res) { ::CloseHandle(pi.hThread); ::WaitForSingleObject(pi.hProcess,INFINITE); // 等待进程结束 } else printf("进程启动失败!\n"); return 0; } 再看看别人怎么说的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯