我们知道用 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 –> Properties -> Configuration Properties –> Linker -> System (VS2005/08)中看到,其中的 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 –> Properties -> Configuration Properties –> Linker -> System 中手工改动!
转载自http://blog.csdn.net/chenyusiyuan/article/details/4618962