我想用CreatProcess函数调用C盘目录下的test.exe程序,同时需要将test.exe的标准输入输出重定向到文件输入输出(输入重定向到in.txt,输出重定向到b.txt)。
请问CreatProcess的前两个参数如何确定?第一个参数似乎是“C://test.exe”,第二个命令行参数应该怎么写?
C语言中CreatProcess函数参数问题!急!!!!
答案:3 悬赏:80 手机版
解决时间 2021-02-06 00:18
- 提问者网友:听门外雪花风
- 2021-02-05 15:06
最佳答案
- 五星知识达人网友:迟山
- 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吧,比较有用。
那你看看是否可以使用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;
}
再看看别人怎么说的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯