让VC编译出来的程序不显示CMD黑色窗口

让VC编译出来的程序不显示CMD黑色窗口

 

让VC编译出来的程序不显示CMD黑色窗口,只要在代码最前面加入下面这句:


#pragma comment(linker,"/subsystem:windows")

 

 

 

#ifdef NDEBUG
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#endif

首先来看一下linker的 /subsystem 选项
  
  该选项的语法形式如下:
  /SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|
  EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}
  [,major[.minor]]
  
  这个链接选项告诉操作系统如何运行可执行文件
  
  CONSOLE:
  win32 字符模式应用程序,此种类型的应用程序在运行的时候会产生一个类似DOS窗口的控制台窗口,如果在应用程序的主函数为main()或者wmain(),在默认情况下该应用程序就是一个控制台应用程序
  
  Extensible Firmware Interface和CPU具体架构相关的一个参数选项,并不常用,在这里暂不详细介绍.如果对此有兴趣的可以访问intel主页来查看相关内容
  
  NATIVE;
  设备驱动器选项,如果/DRIVER:WDM选项被设定的话,该链接选项(NATIVE)就为默认选项
  
  POSIX:
  在windows NT 种运行在POSIX子系统上的应用程序
  
  WINDOWS:
  该类型的应用程序不产生console窗口,该类型的应用程序的窗口由用户自己创建,简而言之就是一个标准的Win32 application,其入口地址为WinMain()函数或者wWinMain()函数的地址如果你在应用程序种定义的主函数为WinMain或者wWinMain,在默认情况下该应用程序就是一个Win32 Application !
  
  WINDOWSCE:
  运行在windows CE上的应用程序
  
  major and minor (optional):
  主版本号和次版本号,该选项为可选,该选项为0~65535之间的十进制整数
  
  从上面可以看出如果我们建立一个win32 console application的话,linker的/subsystem选项应该为CONSOLE,可以在VC开发环境的project->setting->link->project option中看到!
  
  接下来我们再看看应用程序是如何运行的!
  我们知道用VC编写的程序,运行的时候是需要 C\C++运行库支持的.当我们运行一个C/C++程序的时候链接器会首先寻找应用程序的启动函数,例如:
  如果你建立了一个console程序的话,编译器得链接开关会是以下这种形式
  /subsystem:"console" /entry:"mainCRTStartup"  (ANSI)
  /subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)
  
  如果你建立了一个win32 application,编译器得链接开关则会是一下形式
  /subsystem:"windows" /entry:"WinMain"  (ANSI)
  /sbusystem:"windows" /entry:"wWinMain" (UINCODE)
  
  上面的两种形式可以再project->setting->link->project option中看到上面的subsystem和entry并不需要都设置,如果你只设置了/subsystem:"console"的话,那么默认的entry开关在默认情况下应为/entry:"mainCRTStartup"反之,如果你在应用程序中定义了main函数的话,默认情况下,你的/subsystem开关应该为/system:"console"
  
  在默认情况下/subsystem 和/entry开关是匹配的,也就是console对应mainCRTStartup或者wmainCRTStartupwindows对应WinMain或者wWinMain
  
  但是我们也可以通过手动改动的方式使他们不匹配
  
  例如我们可以这样改动
  
  #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 设置入口地址
  
  int main(int argc, char* argv[])
  {
  MessageBox(NULL, "hello", "Notice", MB_OK);
  return 0;
  }
  
  在默认情况下链接器看到/subsystem下是windows选项的时候,它会自动寻找WinMain或者wWinMain
  
  但我们强制指定入口地址,这样运行程序的时候默认的console窗口就会隐藏!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Only Chinese document is available. EplOnCpp (EOC for short) 介绍 基于Cpp构建的Epl语言编译环境 用于支持x64程序编写及实现特殊功能 版本 版本编号:Build 20190406 版本类型:概念预览(Concept Preview) 缺乏较多库命令支持,几乎不可能用于实际工程 请勿将其使用在正式工程中,在未来的版本中,其行为可能与预览版有很大不同 开源许可证 项目 许可证 EplOnCppCore The MIT License EplOnCppGUI The MIT License EocSystemEnv The MIT License EocLib_krnln The MIT License EocLib_EocHelper The MIT License 已知限制 不支持窗口功能 不支持“资源” 不支持编写DLL 不支持Linux程序编写 不支持置入代码(无法解决) 通用型功能相当不完善,建议避免使用(库、API声明除外,可放心使用) 用户使用指南 基本条件 正确安装了.NET 4.0(或兼容版本)Windows 10自带 任何支持C++ 17标准的编译器目前仅在VS2017下进行了测试,在clang等编译器下使用时极可能遇到问题 明确不支持VS2015/VS2012/VS2010/VC6等任何缺少C++ 17支持的编译器 cmake编译系统建议在安装VS时勾选cmake支持以便快速完成安装并获得VS IDE支持 安装配置 配置EOC系统环境 解压env.7z 设置环境变量“EOC_HOME”为“eoc”文件夹路径 重启以确保环境变量生效 解压GUI.7z到任意目录 安装EocHelper库 安装EocHelper库可以使用一些EOC附加功能(通常用于跨平台) 解压EocHelper.fne.build,将fne文件拷贝到e/lib目录 重启易语言,勾选EocHelper库启用 使用 生成工程文件 编写*.e文件 在编译菜单中选择 编译为Windows模块文件 在EOC主程序(GUI.7z/QIQI.EplOnCpp.GUI.exe)中输入模块文件路径 在EOC主程序中选择正确的工程类型 输入输出目录路径 点击按钮生成 编译 生成目录中将包含完整的cmake工程信息,请您使用cmake命令行自行编译 新版本的VS也包含了良好的cmake支持(需要安装),您可以在配置成功后,通过“在VS中打开文件夹”来浏览工程 XP支持 EOC不对XP系统提供主流支持,且任何对XP的有限支持都可能在未来的版本中移除 但由于VS2017仍然保留有限XP支持,您可以在cmake中使用参数-T v141_xp编译 为了更好的兼容性,您可以还需要使用 VC-LTL 等项目 库编写指南 请参照核心库的编写,正确编写C++代码、cmake配置文件config.cmake和库信息文件info.json 规范 命名 所有库命令应该放在命名空间e::lib::{LibName}下,其中{LibName}为库的英文名 自定义类型 所有自定义结构应该为智能指针类型e::system::struct_ptr的别名,其中Raw为原始类型 所有自定义类应该为智能指针类型e::system::object_ptr的别名,其中Raw为原始类型,应继承自e::system::basic_object 并正确实现clone函数 info.json 库信息文件 CMakeName描述库在CMake配置文件中的名称, 应与config.cmake中信息相匹配 Cmd/Type/Constant/Enum描述库提供的命令/类型/常量/枚举,其类型为Object【Key为中文名,Value为具体信息】 config.cmake cmake配置文件 其应当正确配置库项目并定义{CMakeName}_FOUND/{CMakeName}_INCLUDE_DIRS/{CMakeName}_LIBRARIES, 其中{CMakeName}应与info.json中信息相匹配 SuperTemplate 用于实现某些特殊支持库, 接口极不稳定 ,如非必要请避免使用 类型 中文名 类型名 算术类型 - 字节型 uint8_t 短整数型 int16_t 整数型 int32_t 长整数型 int64_t 小数型 float 双精度小数型 double 平台整数 intptr_t 非算术基本类型 - 文本型 e::system::string 字节集 e::system::bin 日期时间型 e::system::datetime 子程序指针 e::system::methodptr 通用型 e::system::any 高级类型 -

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值