CreateProcess函数而不是系统

时间:2014-10-24 07:25:01

标签: c++ winapi system createprocess

我创建了一个使用Windows窗体应用程序构建gui的代码。我在我的代码中使用系统命令来调用外部.exe。但是,这种方法创建了一个命令行终端。我发现我可以用CreateProcess函数here替换系统。我该如何使用这个功能?我应该指定哪些参数才能运行?我现在的代码是:

 string run_template = "a.exe -i " + s1 + " -r 10 -f image2  filename%03d.jpg";
 system(run_template.c_str());

编辑:

 #include <tchar.h>

 string workPath = "";
 string args = "-i " + s1 + " -r 10 -f image2  vid/frames/filename%03d.jpg";

 HINSTANCE hRet = ShellExecute(NULL, _T("open"), _T("a.exe"), _T(args.c_str()), _T(workPath.c_str()), SW_HIDE);
 DWORD errNum = GetLastError();

我收到以下错误:

1>c\projects\first_api\first_api\Form1.h(229): error  C2065: 'Largs' : undeclared identifier
1>c:\projects\first_api\first_api\Form1.h(229): error C2228: left of '.c_str' must have class/struct/union
1>          type is ''unknown-type'' 
1>c:\projects\first_api\first_api\Form1.h(229): error C2065: 'LworkPath' : undeclared identifier
1>c:\projects\first_api\first_api\Form1.h(229): error C2228: left of '.c_str' must have class/struct/union

EDIT2:

string run_template = "a.exe -i " + s1 + " -r 1 -f image2 /filename%03d.jpg";
//system(run_template.c_str());

STARTUPINFOA si = {sizeof(STARTUPINFOA), 0};
PROCESS_INFORMATION pi = {0};

if (CreateProcessA(NULL, const_cast<char*>(run_template.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))   {
     CloseHandle(pi.hThread);
     CloseHandle(pi.hProcess);
}

使用上述代码时,命令提示符仍然存在。

2 个答案:

答案 0 :(得分:5)

string run_template = "a.exe -i " + s1 + " -r 10 -f image2  filename%03d.jpg";

STARTUPINFOA si = {sizeof(STARTUPINFOA), 0};
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

PROCESS_INFORMATION pi = {0};

vector<char> cmdline(run_template.begin(), run_template.end());
if (CreateProcessA(NULL, &cmdline[0], NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
}

答案 1 :(得分:-5)

您可以使用ShellExecute函数,这很容易理解。

示例:

string workPath = "D:\\MyWorkPath\";
string args = "-i " + s1 + " -r 10 -f image2  filename%03d.jpg

LPCTSTR lArgs = args.c_str();
LPCTSTR lPath = workPath.c_str();
HINSTANCE hRet = ShellExecute(NULL, _T("open"), _T("a.exe"), lArgs, lPath, SW_HIDE);

ShellExecute函数中的最后一个参数隐藏了控制台窗口。

注意:确保您运行的应用程序(a.exe)没有阻止,即不等待您的输入。或者简单地说,您没有在a.exe应用程序中使用任何cin / scanf。

希望这有帮助。