运行EXE文件并使用VC ++从它接收返回值

时间:2014-07-03 19:57:55

标签: visual-c++

我想在VC ++中创建一个程序/函数,允许我运行EXE文件并从中接收返回值。

我要运行的EXE文件是一个控制台应用程序,需要两个参数 Arg1 (String)和 Arg2 (Float),然后返回 OutPut (浮动)。

类似的东西:

OutPut = MyEXEFile.exe Arg1 Arg2 

4 个答案:

答案 0 :(得分:1)

命令行参数只有一种数据类型:C风格字符串数组。

输入和输出只有一种数据类型:字节流。

如果使用CreateProcess头文件中的<windows.h>,则可以提供任何命令行并重定向输出。其他数据类型(如float)的处理方式与在数据文件中处理它们的方式相同。

以下是MSDN上的示例:Creating a Child Process with Redirected Input and Output

答案 1 :(得分:0)

答案 2 :(得分:0)

你过度杀戮了。 对于命令行应用程序,系统命令将执行您要查找的内容。

int status = system("MyEXEFile.exe Arg1 Arg2");

答案 3 :(得分:0)

我找到了解决方案,这对我来说很好,我测试它,它运作良好。

这是我找到解决方案的页面的链接,我修复了一些错误,现在它已准备好实施。

http://www.codeproject.com/Articles/10134/Execute-a-Console-Application-From-VC?fid=172409&fr=26#xx0xx

这是我们需要执行的例子。 PS:这一行不是我们程序的一部分,它只是在这里解释算法:

MyEXEFile.exe Arg1 Arg2 > sResult 

&#34; MyEXEFile.exe&#34; 带两个参数( Arg1 Arg2 )并返回< strong> sResult 变量。

让我们使用CreatProcess使用Visual C ++编写这个例子:

CString ExePath="C:\\MyEXEFile.exe";                     
CString arg1="2";
CString arg2="3";
CString sResult="";

CString strCommandLine = ExePath + " " + arg1 + " " + arg2;

// Call the ExecuteExternalFile function
sResult =   ExecuteExternalFile(strCommandLine);

这是将读取 MyEXEFile.exe 文件输出的函数:

CString ExecuteExternalFile(CString csExecute)
{
  SECURITY_ATTRIBUTES secattr; 
  ZeroMemory(&secattr,sizeof(secattr));
  secattr.nLength = sizeof(secattr);
  secattr.bInheritHandle = TRUE;

  HANDLE rPipe, wPipe;

  //Create pipes to write and read data
  CreatePipe(&rPipe,&wPipe,&secattr,0);
  //
  STARTUPINFO sInfo; 
  ZeroMemory(&sInfo,sizeof(sInfo));

  PROCESS_INFORMATION pInfo; 
  ZeroMemory(&pInfo,sizeof(pInfo));

  sInfo.cb=sizeof(sInfo);
  sInfo.dwFlags=STARTF_USESTDHANDLES;
  sInfo.hStdInput=NULL; 
  sInfo.hStdOutput=wPipe; 
  sInfo.hStdError=wPipe;

  char command[1024]; 
  strcpy(command,csExecute.GetBuffer(csExecute.GetLength()));

  //Create the process here.
  CreateProcess(0,command,0,0,TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo);
  CloseHandle(wPipe);

  //now read the output pipe here.

  char buf[100];
  DWORD reDword; 
  CString m_csOutput,csTemp;
  BOOL res;
  do
  {
      res=::ReadFile(rPipe,buf,100,&reDword,0);
      csTemp=buf;
      m_csOutput+=csTemp.Left(reDword);
  }while(res);


    CloseHandle( pInfo.hProcess );
    CloseHandle( pInfo.hThread );

  return  m_csOutput;
}