C++ 在Win32程序中用main()函数替换WinMain()

C++ 在Win32程序中用main()函数替换WinMain(),c++,winapi,C++,Winapi,我在StackOverflow和Google上搜索了一下,但没有找到答案。我想用这种类型的用户编程启动我的应用程序: int main() { Window App("Test", 640, 480); while(App.IsOpen()) { // Do the stuff } } 但这是不可能的,因为我应该将hInstance和hPrevInstance以及其他参数传递给WinMain函数。实际上,我设计了一个窗口类,使窗口的创建更容易一些。我在SFML上看到了

我在StackOverflow和Google上搜索了一下,但没有找到答案。我想用这种类型的用户编程启动我的应用程序:

int main()
{
  Window App("Test", 640, 480);

  while(App.IsOpen())
  {
    // Do the stuff
  }
}
但这是不可能的,因为我应该将
hInstance
hPrevInstance
以及其他参数传递给
WinMain
函数。实际上,我设计了一个窗口类,使窗口的创建更容易一些。我在SFML上看到了这个实现,但我不知道它是如何实现的

现在我用的是通常的方式:

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR, int)
{
  Window App(hInst, hPrevInst, "Test", 640, 480);

  while(App.IsOpen())
  {
    // Do the stuff
  }
}

谢谢。

将为您提供
hInstance
hPrevInstance
始终为
NULL

您可以在“windows”应用程序(即GUI子系统windows应用程序)中使用标准的
main
,即使在使用Microsoft工具的情况下,如果您将以下内容添加到Microsoft链接器选项中:

/subsystem:windows /ENTRY:mainCRTStartup
请注意,这对于GNU工具链不是必需的

对于Microsoft工具,您也可以将其添加到主文件:

#ifdef _MSC_VER
#    pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

如何获取hInstance。

首先,
GetModuleHandle(0)
提供可执行文件的模块句柄,该句柄与
WinMain
hInstance
参数相同

使用GNUToolchainG(g++编译器),标准的一致性代码就可以了

但是,对于控制台子系统可执行文件,Microsoft工具链默认只接受符合标准的代码。要使用此不一致的工具链创建GUI子系统可执行文件,使用标准的
main
,必须指定调用标准
main
的Microsoft运行时库入口点,即
mainCRTStartup
。对于命令行调用,这意味着

cl myApp.cpp /link /entry:mainCRTStartup /subsystem:windows user32.lib
实际上,要在命令行中工作,只需在
链接
环境变量中指定入口点即可:

set LINK=/entry:mainCRTStartup


为Visual Studio创建类似的符合标准的设置可能并不可取,因为某些Visual Studio项目类型(主要是MFC)需要使用Microsoft的非标准
WinMain
wWinMain
hInstance
是“从不使用全局变量”经验法则的一个例外。通常,没有一个变量在逻辑上具有模块范围的作用域<然而,根据定义,code>hInstance的作用域正好是模块范围,因此实际上最合理的解决方案是为它创建一个全局变量,并在
WinMain
中初始化它


正如其他人所建议的,您也可以使用
GetModuleHandle(NULL)

这实际上不是真的。例如,考虑编译一个静态库。每个PE文件只有一个
HINSTANCE
。是的,但是对于使用全局变量的代码,没有区别。变量可以具有的最大范围是模块范围。范围小于此值不会有什么坏处。但它仍然没有必要拥有更多的范围。使用全局变量是可以的,只要您将它们视为全局状态的一部分,并且不要试图隐藏它们。当全局变量位于全局范围而不是匿名/命名结构中,并且当多个世界试图与它们交互时,它们是有害的。也就是说,向代码中添加全局变量就像扩展运行时一样;这样做是可以的,但你必须将它们捆绑在一起,以限制全球范围的污染,最好是使它们静止。良好地使用全局变量可以清楚地表明您的程序目前拥有哪些资源,糟糕的使用会使你的代码变成一个全球性的粪池。编辑:我没有抱怨误导性的答案,而是更正了它。我最初将此编辑回滚,因为我认为对于大多数试图在windows平台上实现此功能的人来说,现在的答案更为清晰,没有必要谈论gnu,因为1)大多数人不在windows上使用它,2)他们无论如何都不会有这个问题。。。。但是我不想进入一个参数,所以我已经将您的编辑放回原处:)其他参数也可以在没有
WinMain
的情况下获取:
cl myApp.cpp /link /subsystem:windows user32.lib