创建没有窗口的应用程序

kie*_*wic 24 c c++ winapi

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

com*_*ife 39

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

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

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

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

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

#include <Windows.h>

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

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

  • 不应该是int WINAPI WinMain(...)? (2认同)

Bri*_*ndy 14

在Windows中:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // <-- Program logic here
    return 0;
}   
Run Code Online (Sandbox Code Playgroud)

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

在其他平台上:

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

  • @Brian - 如果没有指定返回值,main()默认返回0.这是一个疯狂的特殊情况,仅适用于main(). (3认同)
  • 你想回归0,所以你可以表示调用它的程序的成功. (2认同)