mfc下调用console程序——四种方法

来源:互联网 发布:运动文胸 知乎 编辑:程序博客网 时间:2024/06/06 01:02

说明:基于对话框的MFC程序+console程序,vc6.0下。

一、由于在MFC下做了界面,而在Console程序下做的训练和识别部分,而将这部分整合到MFC下很繁琐,所以就在MFC下button控件添加响应函数直接调用console程序的exe。网上有很多人介绍相关知识,主要是四个函数:

WinExec,ShellExecute ,ShellExecuteEX,CreateProcess。

(1)WinExec比较简单

UINT WinExec( LPCSTR lpCmdLine,   // 命令路径  ,UINT uCmdShow      // 显示方式  );

(2)shellExecute

      HINSTANCE ShellExecute(

      HWND hwnd,           //父窗口句柄

      LPCTSTR lpOperation,   //操作, 打开方式 "edit","explore","open","find","print","NULL"

      LPCTSTR lpFile,         //文件名,前面可加路径

      LPCTSTR lpParameters,   //参数

      LPCTSTR lpDirectory,    //默认文件夹

      INT nShowCmd          //显示方式

);

(3) ShellExecuteEx

BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);

要注意到应用这个结构,将其中得参数设置好即可。
SHELLEXECUTEINFO 结构

(4)CreateProcess

一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了

(5)区别与联系:

WinExec功能最简单,他的存在是为了向下兼容(WinExe是从16位Win3.x开始就有的函数) 。 

ShellExecute与ShellExecuteEx的区别是ShellExecuteEx可以返回新创建进程的 hProcess

ShellExecute 在创建进程后立即调用CloseHandle 关闭新进程句柄而ShellExecuteEx将其返回。 

    CreateProcess 应该是 ShellExecute / ShellExecuteEx 实现的基础。 注意调用CreateProcess/ ShellExecuteEx 这类返回新进程句柄(CreateProcess 还返回新进程的主线程句柄),如果不需要访问这些内核对象,应该立即调用CloseHandle关闭这些句柄,否则即使新进程终止执行,保存他的状态的内核对象仍不会被清除。

二、(1)开始选用shellexcute,但是由于要把exe运行结果保存到txt文档中,运行的过程中经常不能正确读取文件,所以需要等到调用的程序线程运行结束,再回到主程序运行。加上WaitForSingleObject(h,INFINITE);,其中h是shellexecute返回的句柄,调用程序运行完竟然不能自动结束了(搞不懂为什么。。。。)

(2)换成应用shellexecuteEx,并使用WaitForSingleObject(ShExecInfo.hProcess,INFINITE);程序可以正常运行了。

、待改进工作:

(1)第四种方法还没用试。

(2)在程序运行过程中,需要对方的数据传递,看到的方法主要是管道,但是还没有尝试,现在实现都是依托在txt文档。即:将MFC主程序执行特征结果保存在test.txt中作为调用程序的读入文件,然后再将调用程序运行识别结果存为result.txt中,再让MFC程序读取,得到识别结果,所以要找方法实现二者之间的通信。

原创粉丝点击