创建没有窗口的应用程序

如何编写可以在不打开窗口或控制台的情况下运行的C / C ++应用程序?

编写WinMain程序时,会自动将/ SUBSYSTEM选项作为编译器中的窗口。 (假设您使用Visual Studio)。 对于任何其他编译器,可能存在类似的选项,但标志名称可能不同。

这会导致编译器以可执行文件格式( PE格式 )创建一个条目,将可执行文件标记为Windows可执行文件。

一旦此信息出现在可执行文件中,启动程序的系统加载程序将把您的二进制文件视为Windows可执行文件而不是控制台程序,因此它不会导致控制台窗口在运行时自动打开。

但是Windows程序如果不需要就不需要创建任何窗口,就像你在任务栏中看到的那些程序和服务一样,但是没有看到任何相应的窗口。 如果您创建一个窗口但是选择不显示它,也会发生这种情况。

所有你需要做的就是实现这一切,

#include  int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int cmdShow) { /* do your stuff here. If you return from this function the program ends */ } 

您需要WinMain本身的原因是,一旦您将子系统标记为Windows,链接器就会假定您的入口点函数(在程序加载和C Run TIme库初始化后调用)将是WinMain而不是main。 如果您未在此类程序中提供WinMain,则在链接过程中将出现未解决的符号错误。

在Windows中:

 #include  int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // <-- Program logic here return 0; } 

请务必使用Adam Mitz提到的/ SUBSYSTEM链接器开关。

在其他平台上:

 int main(int argc, char**argv) { // <-- Program logic here return 0; } 

如果您需要在没有控制台或窗口的情况下连续运行程序,您可能会在* NIX上找到有用的守护程序或Windows 上的 服务 ,这个.NET示例如果您需要简单的win32,只需谷歌一点点样本。
由于您的问题标记为win32,我认为服务更适合您。

在将子系统设置为windows后(如user17224所建议),在将main更改为WinMain(由user17224和Brian R. Bondy建议)之后的Visual Studio Express 2010中,可以将属性中的entry函数设置为main,链接器,高级,入口点:只需在文本框中键入main。

使用Visual Studio向导创建Win32应用程序。 但是不要创建窗口,即删除窗口创建function。 或者,我们可以创建Win Service应用程序。

如果您使用的是MSVCVisual Studio,只需使用新的Project Wizard并选择Console Application