定义独立于 UNICODE 的 WinMain 函数的正确方法是什么?

What is the correct way to define a UNICODE independent WinMain function?

为使用 CRT 的 Windows 程序定义 UNICODE 独立 WinMain 函数的正确方法是什么?

我倾向于认为应该是这样的

WINAPI
#ifdef UNICODE
  wWinMain
#else
  WinMain
#endif
 ( ... ) {
  ...
}

但是,我想知道在编译源单元时是否还没有扩展为正确符号的预定义宏(例如 windows 头文件中提供的扩展为 WinApiFuncAWinApiFuncW.

<tchar.h> 中,宏 _tWinMain 扩展为 WinMainwWinMain,具体取决于项目设置。但这还不够;您还需要使用与字符集无关的 LPTSTR 声明第三个参数 (lpCmdLine):

int APIENTRY _tWinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPTSTR lpCmdLine, 
    int nShowCmd
)

如果在项目上启用了 Unicode,这将变为 LPWSTR,给出签名:

int APIENTRY wWinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPWSTR lpCmdLine, 
    int nShowCmd
)

如果未启用 Unicode,您将获得签名:

int APIENTRY WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nShowCmd
)