C++ ----调用exe的函数

来源:互联网 发布:欧德堡牛奶怎么样 知乎 编辑:程序博客网 时间:2024/05/01 23:56
       文章从自己的QQ(632846506)7年前的日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。
       在开发大型项目的时候,采取的都是把各个功能分开来开发,分开开发可能是生成dll,也有可能生成的是exe文件,而其中有的时候也会调用现成的工具包里面的一些exe文件,这样在项目里面就要通过调用exe文件来使用。这种相互调用exe可执行文件我暂且叫做多子程序联动模式,这有助于提高架构整体的灵活性和稳定性。优势是:
        1、该种方法可使大型项目中的各程序功能复合性低,采用单体程序作为节点便于管理。
        2、能有效的减除各功能间的耦合性,避免程序的错误株连,极大限度保障各功能的有效运行、自我修复再生能力和维护。

     那么在C++里面直接调用exe文件的方法有哪些呢?现在可考虑的方法主要有:

      a.使用system函数

      b.使用exec或者是execv函数

      c.使用WinExec函数

      d.使用CreateProcess函数

      e.使用ShellExcecuteEx函数

      1)上面的5种方法中,system函数,函数原型system(执行shell命令)定义函数是,int system(const char * string),可以调用一些DOS命令,比如:

     system("cls");//清屏,等于在DOS上使用cls命令

     system函数会调用fork()函数产生子进行横,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回调用的进程,system函数不能控制程序窗口是否显示。

     2)使用execl或execv函数

     这是exec函数族里面的两个函数,在UNIX环境下用的比较多,exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,也就是说在调用进程内部执行一个可执行文件,这里的可执行文件既可以是二进制文件,也可以是任何Linux下的可执行的脚本文件,与一般情况不同,exec函数族的函数执行成功后不会返回,只有调用失败了才会返回一个-1,从原程序的调用点接着往下执行。它也是不能控制程序窗口是否显示。

    3)使用WinExec函数

    WinExec函数可以方便地在应用程序中执行一个程序,执行一个标准程序一般使用:

           WinExec('C:\WINDOWS\NOTEPAD.EXE', SW_SHOWNORMAL);

     第二个参数是控制程序主窗口的显示方式,用WinExec只能执行exe文件,但是WinExec函数不好控制主程序来等该exe程序的结束。WinExec是Windows的老函数了,现在的CreateProcess几乎可以替代WinExe的所有功能。

 

     4)使用CreateProcess函数

     CreateProcess函数是新建一个进程,下面是一个使用CreateProcess函数的例子:

void createchildprocessandwaituntildone(const ansistring& strcmdline)
{

    process_information piprocinfo;
    startupinfo sistartinfo;

    // set up members of startupinfo structure.
    sistartinfo.cb = sizeof(startupinfo);
    sistartinfo.lpreserved = null;
    sistartinfo.lpreserved2 = null;
    sistartinfo.cbreserved2 = 0;
    sistartinfo.lpdesktop = null;
    sistartinfo.dwflags = 0;

    // create the child process.

     createprocess( null,

                         strcmdline.c_str(),
                         null, // process security attributes
                         null, // primary thread security attributes
                         0, // handles are inherited
                         0, // creation flags
                         null, // use parent\'s environment
                         null, // use parent\'s current directory
                         &sistartinfo, // startupinfo pointer
                         &piprocinfo); // receives process_information

                        // wait for the processs to finish
                        dword rc = waitforsingleobject(piprocinfo.hprocess, // process handle

                                                                  infinite);
}

     使用CreateProcess函数,你必须人为地控制该进程的生死,这一方面是使用进程控制来实现。进程控制的意义在于可以创建一个进程,并且可以通过进程句柄结束进程。

     5)使用ShellExcecuteEx函数

     这个函数主要是在文件上执行一个函数,如果执行成功则返回一个非0值,否则返回一个0值。函数的原型是:

     WINSHELLAPI BOOL WINAPI ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo );

     参数lpExecInfo:是数据结构 LPSHELLEXECUTEINFO 的地址,包含了和接收一些被执行的应用程序的一些信息。下面是一个使用的示例:

     SHELLEXECUTEINFO ShExecInfo = {0}; 
     ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
     ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
     ShExecInfo.hwnd = NULL; 
     ShExecInfo.lpVerb = _T("open"); 
     ShExecInfo.lpFile = _T("a.exe"); 
     ShExecInfo.lpParameters = _T("-a a"); 
     ShExecInfo.lpDirectory = NULL; 
     ShExecInfo.nShow = SW_HIDE; 
     ShExecInfo.hInstApp = NULL; 
     ShellExecuteEx(&ShExecInfo);
     AfxGetApp()->BeginWaitCursor();
     WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
     AfxGetApp()->EndWaitCursor();

     这个函数可以通过ShExecInfo.lpParameters来传递exe文件的参数,通过属性ShExecInfo.nShow来控制程序窗口是否显示。

     后面三个函数都是SDK函数,现在在执行项目中的exe文件的时候,使用比较多的就是后面得两个函数,我在自己的项目中使用较多的是ShellExecuteEx和system函数。

原创粉丝点击