程序入口函数 main 和 WinMain

Linux 上的程序开发和 Windows 上有很大不同。程序入口函数不一样是其中的差别之一。

main()

int main(int argc, char *argv){
    return 0;
}

WinMain()

Windows 环境下的 GUI 程序入口函数是 WinMain()

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prev, LPSTR cmdline, int show){
    return 0;
}

Use main() as WinMain()

有意思的是,实际上可以从 main() 函数开始写一个 Windows GUI 程序。 WinMain() 函数的参数是可以通过相应的 API 得到的。

#include <windows.h>

int main(int argc, char *argv[]){
  HINSTANCE hInst = GetModuleHandle(NULL);
  HINSTANCE prev  = NULL;
  LPSTR     cmdline = GetCommandLineA();
  int       show;

  ...
}

用 GCC 进行编译的命令如下

i686-w64-mingw32-gcc -mwindows -o test.exe test.c

Message Loop in WinMain()

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prev, LPSTR cmdline, int show){
    ...

    MSG msg;
    while (GetMessage ( &msg, NULL, 0, 0 ) ) {
      TranslateMessage( &msg );
      DispatchMessage ( &msg );
    }
    ...

    return msg.wParam
}

Unicode wmain() and wWinMain()

main()WinMain() 的参数都是基于 ascii 字符。 为了支持 Unicode 字符,wmain()wWinMain() 应需而生。

int wmain( int argc, wchar_t* argv[] );

int WINAPI wWinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    PWSTR       lpCmdLine,      // LPSTR in WinMain()
    int         nCmdShow
    );

网络资源