windows应用程序与控制台应用程序的区别
从表面上来看控制台程序运行时是在DOS环境下或者模拟dos环境运行的程序运行时一般会启动一个提示符窗口。而应用程序是Windows环境下的窗口程序。运行时一般会启动一个窗口画面。例如病毒木马就不显示窗口这决定于是否创建了窗口或者是否让窗口显示。
但是,实质上windows应用程序和控制台应用程序的真正区别是PE文件的结构不同这点不需要我们去关心编译器会根据你的选择去构建生成的exe文件的PE结构。
如何告之编译器你的选择在编译器进行连接的时候给它一个连接参数subsystem:windows或者subsystem:console来告诉它。对于大多数编程工具来说一般在“工程->设置->连接”这个表单里面就可以看到这个参数。
但是通常在我们要创建一个新的工程的时候编译器会让我们事先选择好是创建windows应用程序还是创建控制台应用程序。这个参数的设置就不用我们操心了。
事实上,控制台程序依然还有区别那就是16位的可以在DOS操作系统环境中运行的DOS程序也可以在window运行通常windows会模拟一个dos环境,这时你会程序窗口与平时的提示符窗口明显不一样和32位通常只能在windows操作系统中运行的程序。通常32位控制台在DOS下运行它的PE结构中会给予DOS环境下运行的一个入口点(DOS文件头这个入口点只有“一行”代码"This program cannot be run in DOS mode"。
而在32位系统下操作系统将将查看PE文件头里面的subsystem字段来获得程序将以什么方式运行(windoes或者console)。这个字段里面指示了子系统(CUI对应控制台,GUI对应普通程序,驱动程序等没有子系统)32位的控制台程序当然可以调用API函数,而16位的DOS程序则不可以调用API函数。
再补充关于编译器的一点内容通常大学里面学习Cc++时最常用的是VC6.0TC++3.0 和 TC2.0 VC6.0只能写32位程序。也就是不能写Dos程序。而TC++3.0 和 TC2.0这两个编译器是16位的编译器不能写窗口程序,因为调用不了API之所以调用不了固然是编译器的限制,但实质是编译器根本不去使用32位寄存器。
那么,如何才能写一个即可以在DOS运行又可以在windows下运行的程序(还要带窗口)那就是要修改exe的PE文件结构使用人工方法粘贴代码。
windows应用程序与控制台应用程序的区别相关推荐
- 【Android 逆向】Android 逆向通用工具开发 ( Windows 平台运行的控制台应用程序类型 | 编译 Windows 平台运行的 Android 逆向程序 )
文章目录 一.Windows 平台运行的控制台应用程序类型 二.编译 Windows 平台运行的 Android 逆向程序 一.Windows 平台运行的控制台应用程序类型 hacktool 工程的类 ...
- vs窗体应用linux,使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)...
使用Visual Studio2019创建C#项目(窗体应用程序.控制台应用程序.Web应用程序) 一.VS的开发环境 首先你得安装了vs2019,然后确认下下面三个组件是否存在,如果没有要下载一下. ...
- Windows上使用C#控制台应用程序打开指定路径的文件
例如打开Windows操作系统里的cmd.exe(命令行程序) using System; using System.Collections.Generic; using System.Linq; u ...
- windows下cmd命令提示符下让程序后台运行命令
如果你的程序需要在windows后台运行,并且是在cmd下启动,那么在执行的程序前加上start /b,比如start /b [程序名]. windows下start命令的详细参数及功能介绍如下: 启 ...
- 如何在.NET控制台应用程序中获取应用程序的路径?
如何在控制台应用程序中找到应用程序的路径? 在Windows Forms中 ,我可以使用Application.StartupPath查找当前路径,但这似乎在控制台应用程序中不可用. #1楼 上面的答 ...
- 如何:创建 C# 控制台应用程序
本主题旨在生成最简单形式的 C# 程序(控制台应用程序)熟悉 Visual Studio 2008 开发环境.由于控制台应用程序是在命令行执行其所有的输入和输出,因此对于快速测试语言功能和编写命令行实 ...
- 列举窗体控制台应用程序中的3中控件_今天来点枯燥的,Visual C#的Windows窗体运行过程...
我们上一期只是在windows窗体上放了三个控件,并编写了一段小程序,实现了触发窗体上的按钮,使得标签上的内容改变,并能够结束运行当中的程序: 然而,我们在编写代码窗口时,windows窗体自动嵌入了 ...
- 如何在C#Windows控制台应用程序中更新当前行?
使用C#构建Windows控制台应用程序时,是否可以在不扩展当前行或转到新行的情况下写入控制台? 例如,如果我想显示一个百分比,该百分比代表一个过程到完成为止的距离,我只想在与光标相同的行上更新值,而 ...
- 屏蔽控制台应用程序的窗口#pragma comment(linker, /subsystem:windows /ENTRY:mainCRTStartup)...
众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),但很多时候控制台程序的执行逻辑根本不需要与用户进行交互,所以显示这个难看的窗口纯属多余,那么如何将它屏蔽掉呢?下面我向大家介绍一种 ...
最新文章
- Pyramid Scene Parsing Network
- 神策数据与 IPIP.NET 强强联合,精准 IP 让用户行为分析更精确
- java 单例模式打包jar_在 Spark 中实现单例模式的技巧
- spring bean初始化及销毁你必须要掌握的回调方法。
- 如何查阅资料?(找数据集,文献...)
- springboot细节挖掘(日志系统)
- opencv 鼠标事件
- 关于Dijkstra三种堆速度的研究
- Git:查看所有远程分支以及同步远程代码
- 震惊!99%的人不知道的Linux权限问题细节
- 全智通A+常见问题汇总解答—A+修正维修详情页面打印派工清单和领料清单按钮无效
- win10系统安装到服务器失败,win10安装失败怎么办?
- 尼克 超级智能 路线_他山石|《超级智能》作者尼克·波斯特洛姆:超级智能将决定人类的未来...
- linux ps显示完整command
- Himall商城ExpressDaDaHelper订单预发布 查询运费后发单接口
- 扶蕾wlt~学习计划——MATLATB
- awss3mysql_Amazon aws s3 加速
- 「游戏开发」游戏服务器端开发的一些经验
- 解决 HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
- DAVSE VCC-H10004K超高清会议摄像机