VC调用DOS命令:system, WinExec, ShellExecute, CreateProcess详解
需积分: 50 74 浏览量
更新于2024-07-24
收藏 161KB DOC 举报
"VC调用DOS命令浅析"
在Windows编程中,有时我们需要在VC++环境中执行DOS命令,这通常涉及到几个API函数的使用。本文将详细解析这些方法,虽然作者并不推荐直接在代码中使用DOS指令,因为它们可能会引入依赖性和安全性问题。
一、system函数
system函数是最简单的调用DOS命令的方法。它的原型是`int system(const char* string)`,定义在`stdlib.h`头文件中。函数接受一个字符串参数,该字符串包含要执行的DOS命令。例如,`system("cd c:\\windows");`会改变当前目录到Windows目录。需要注意的是,system会创建子进程执行命令,并且会忽略SIGINT和SIGQUIT信号,而SIGCHLD信号会被暂时挂起。返回值表示命令执行的结果,-1表示错误,0表示成功但无子进程,大于0表示子进程的ID。
二、WinExec函数
WinExec函数是另一种执行外部程序的方式。函数原型为`UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow)`,其中`lpCmdLine`是命令行字符串,`uCmdShow`定义了窗口显示方式。参数uCmdShow可能的取值包括SW_HIDE、SW_SHOWDEFAULT等。WinExec的返回值可以用来判断执行结果,如0表示失败,非零表示成功。但要注意,WinExec函数有内存泄漏的风险,因此在某些情况下不是最佳选择。
三、ShellExecute函数
ShellExecute函数提供了更强大的功能,可以执行应用程序、打开文档、发送邮件等。函数原型为`HINSTANCE ShellExecute(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd)`。`lpOperation`可以是"open"、"print"等,`lpFile`是目标文件路径,`lpParameters`是参数。返回值是操作句柄,若小于32,则表示失败。ShellExecute不仅能执行DOS命令,还可以处理文件关联,比如打开文档时自动启动默认的编辑器。
四、CreateProcess函数
CreateProcess是最底层也是最灵活的进程创建函数,允许创建新进程并控制其属性。函数原型复杂,包含多个参数,如`lpApplicationName`是可执行文件名,`lpCommandLine`是命令行参数,`lpProcessAttributes`和`lpThreadAttributes`用于设置进程和线程的安全属性,`bInheritHandles`决定是否继承父进程的句柄,`dwCreationFlags`控制进程创建行为,`lpEnvironment`是环境变量,`CurrentDirectory`是新进程的工作目录,`lpStartupInfo`和`lpProcessInformation`分别用于设置启动信息和接收进程信息。CreateProcess可以精确控制新进程的行为,但使用起来较为复杂。
五、总结
虽然系统提供了多种调用DOS命令或执行外部程序的方法,但直接使用DOS命令可能存在安全隐患,例如命令注入。因此,在实际开发中,推荐使用更为安全的API,如CreateProcess,以更好地控制进程的创建和执行,同时避免不必要的依赖。在考虑效率和安全性的前提下,合理选择适合的函数进行系统调用。
2019-07-26 上传
2009-05-05 上传
2015-04-08 上传
2021-04-10 上传
2010-10-15 上传
2010-05-17 上传
165 浏览量
点击了解资源详情
2014-06-26 上传
hd521
- 粉丝: 0
- 资源: 11
最新资源
- 基于Python和Opencv的车牌识别系统实现
- 我的代码小部件库:统计、MySQL操作与树结构功能
- React初学者入门指南:快速构建并部署你的第一个应用
- Oddish:夜潜CSGO皮肤,智能爬虫技术解析
- 利用REST HaProxy实现haproxy.cfg配置的HTTP接口化
- LeetCode用例构造实践:CMake和GoogleTest的应用
- 快速搭建vulhub靶场:简化docker-compose与vulhub-master下载
- 天秤座术语表:glossariolibras项目安装与使用指南
- 从Vercel到Firebase的全栈Amazon克隆项目指南
- ANU PK大楼Studio 1的3D声效和Ambisonic技术体验
- C#实现的鼠标事件功能演示
- 掌握DP-10:LeetCode超级掉蛋与爆破气球
- C与SDL开发的游戏如何编译至WebAssembly平台
- CastorDOC开源应用程序:文档管理功能与Alfresco集成
- LeetCode用例构造与计算机科学基础:数据结构与设计模式
- 通过travis-nightly-builder实现自动化API与Rake任务构建