zz:控制台程序后台运行

控制台程序后台运行

2010-07-10 07:06 P.M.


#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 设置入口地址    
  
    
    
在控制台程序中隐藏控制台窗口! 
大家都知道,当编写一个win32 console application时,当运行此类程序的时候 
默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序 
中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自 
动退出.

下面就介绍一下,如何隐藏win32 console application的console窗口

因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译 
器的链接开关选项(也就是linker选项).

首先我们来看一下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或者wmainCRTStartup 
windows对应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窗口就会隐藏!

上面是在代码中使用#pragma指令来设置,还有一种就是直接在开发环境的 
project->setting->link->project option中手工改动!

解决方案二:

那就是直接在EXE文件中将PE文件头的Subsystem从3改成2。在EXE文件中,PE文件头的偏移地址是0x3c,Subsystem是一个WORD,它在PE文件头中的偏移是0x5c

注释:

LINK的时候需要指定/subsystem,这个链接选项告诉Windows如何运行可执行文件。

控制台程序是/subsystem:"console"

其它程序一般都是/subsystem:"windows " 将 subsystem 选成"console"后,Windows在进入可执行文件的代码前(如mainCRTStartup),就会产生一个控制台窗口。

如 果选择"windows",操作系统就不产生console窗口,该类型应用程序的窗口由用户自己创建。 可执行文件都有一个Entry Point,LINK时可以用/entry指定。缺省情况下,如果subsystem是“console”,Entry Point是 mainCRTStartup(ANSI)或wmainCRTStartuup(UNICODE),即:

/subsystem:"console" /entry:"mainCRTStartup" (ANSI)

/subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)

时间: 2024-10-22 23:25:04

zz:控制台程序后台运行的相关文章

linux下如何让控制台程序后台运行

方法1:./test & 方法2:(./test &) 方法3:nohup 和bg 方法4:screen -mS test /root/test   退出程序需要手动进入screen创建的test虚拟终端去退出 方法5:修改并保存一下代码为脚本,运行 #!/bin/bash NAME=$(basename "$0") PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/roo

windows下cmd命令提示符下让程序后台运行命令

如果你的程序需要在windows后台运行,并且是在cmd下启动,那么在执行的程序前加上start /b,比如start /b [程序名]. windows下start命令的详细参数及功能介绍如下: 文章来源 www.169it.com 启动一个单独的窗口运行指定的程序或命令. START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /

Linux系统下程序后台运行nohup,&,screen等

"nohup" 在用户ssh终端断开或者网络端口时,终端没有HUP信号则会关闭所有子进程. nohup则会让进程忽略HUP信号,不受终端断开限制 一般在结尾加上"&"将命令同时放到中断后台运行 nohup标准输出和标准错误输出会被重定向到nohup.out文件中 [[email protected] ~]# nohup ping www.ibm.com & [1] 3059 nohup: appending output to `nohup.out'

Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我还是很操蛋的在QT下写控制台程序了,但是写完程序后运行时出现了如下情况. 程序运行了,但是控制台中居然只有一个光标在那儿跳啊跳.由于百度的姿势不对,废了好多时间,终于明白是因为qt creator不支持Gnome默认的终端gnome-terminal. 所以要换成XTerm的控制台. 具体的解决方式

linux程序后台运行

linux命令后台运行  有两种方式: 1. command & : 后台运行,你关掉终端会停止运行   2. nohup command & : 后台运行,你关掉终端也会继续运行 一. 简介     Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务.因此在任务管理上也有别具特色的管理思想.我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和bg 命令,让你轻松

linux 程序后台运行

有些时候,我们需要在终端启动一个程序,并使之运行——但是如果关闭终端,那么这个程序也就随着关闭了.那么有没有什么方法在关闭终端后,让已经从这个终端启动的程序继续运行呢? 前置知识: xterm,console,tty,pts,pty的区别 shell是直接和内核进行通信的东西 xterm是一个软件概念,可以通过这个程序连接到console从而控制主机,可以理解为cli形式的终端模拟器,而gnome-terminal,konsole就是gui形式的终端模拟器 console是主机的控制台,是一个物

Linux下优雅的让程序后台运行

假设在终端上启动运行了一个程序,跑了几天,如果不小心把terminal关了,那么程序就会终止,这是SIGHUP信号的原因,即使通过bg置为后台运行同样会如此,应该让程序成为一个daemon,步骤如下: 1.Ctrl+z 暂停程序的运行,可以看到程序的作业号,假设为1: 2.bg %1 置为后台运行: 3. disown -h %1 使其不受终端关闭的影响. => The disown command on ksh shell causes the shell not to send a HUP

ios程序后台运行设置(不是太懂)

文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice

Linux nohup 程序后台运行

&方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe --user=mysql & nohup方式: 但是我们很多程序并不象mysqld一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种程序即使使用 & 结尾,如果终端关闭,那么程序也会被关闭.为了能够后台运行,我们需要使用nohup这个命令,比如我们有个star