c++ system()和WinExec()的区别[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。
区别1.
system是c库的函数
WinExec是windows函数
区别2.
system有一个参数,是命令行
Winexec有两个参数,一个是命令行,一个是窗口显示
区别3.
虽然两个都是命令行,但有很大的区别
Winexec的命令行参数一般是一个外部程序的路径加给这个程序的参数,如
Winexec(”D:\\notepad.exe 1.txt”,WM_SHOWWINDOW);
system的命令行参数其实是给cmd程序的参数,system执行的时候是调用cmd程序,
假设system(“D:\\notepad.exe 1.txt“);程序运行时是调用cmd -c D:\notepad.exe 1.txt;
系统就会启动cmd程序,由它执行。所以system的参数就是cmd -c后所对应的参数
(cmd -c 后面应该接什么可以通过cmd /?查看),因此system可以使用”cd E:\”这样的参数,cmd会认识它,
但winexec就不认识。因为没有cd这个程序存在,其实cd只不过是cmd自定义的一个命令。
有时候用winexec和system调用同样的程序,会有不同的结果,
例:
winexec("\"D:\\program files\\notaped.exe\" \"D:\\my document\\1.txt\"",WM_SHOWWINDOW);
system("\"D:\\program files\\notaped.exe\" \"D:\\my document\\1.txt\"",);
看起来两个一样,但运行不一样
winexec可以正常运行,但system会报错,说找不到路径什么的或参数错误。
为什么呢?因为system的参数给cmd,cmd会用自己的方法解析参数(cmd帮助里有说明),
cmd 当碰到一对双引号时,它会把双引号里面的东西提取出来,当有多对双引号时,
它就会用其他方法来解析(老实说我也没看懂它的帮助里关于多对双引号解析的逻辑,如果你看懂了,麻烦告诉我一声)。
那么怎么解决上面的问题呢,很简单,在所有参数外面再包一对双引号
system("\"\"D:\\program files\\notaped.exe\" \"D:\\my document\\1.txt\"\"",);
这样cmd只会去除首尾的双引号,不做其他解析
区别4.
winExec是不同步的进程调用,就是调用起来了就返回了,不会等调用起来的程序结束
system是同步调用进程,调用进程不结束,它就不返回,它可以获取调用进程所返回的值
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157581.html原文链接:https://javaforall.cn
相关文章
- c++ 优先级队列自定义比较函数_队列发送优先级
- 经典游戏—贪吃蛇从C++代码实现[通俗易懂]
- C++递归和迭代的区别,并举例说明[通俗易懂]
- C++ 字符串转时间 与 时间转转字符串[通俗易懂]
- C++ Qt常用面试题整理(不定时更新)[通俗易懂]
- C++之Error无法解析的外部符号[通俗易懂]
- c++ double转string
- C++构造函数的作用_c++什么是构造函数
- C++ vector 初始化大小[通俗易懂]
- C/C++ 反汇编:函数与结构体
- C/C++ 反汇编:分析类的实现原理
- C/C++生态工具链——GDB调试器
- c++基础篇之C++ 模板
- 【C++】位图
- C++继承和组合(无师自通)
- C++ vector(STL vector)底层实现机制(通俗易懂)
- c++连接两个字符串实现代码实现类似strcat功能
- C++类模板与模板类深入详解