[英]Replacing WinMain() with main() function in Win32 programs
我在 StackOverflow 和 Google 上搜索了一点,但无法理解。 我想用这种类型的用户编程来启动我的应用程序:
int main()
{
Window App("Test", 640, 480);
while(App.IsOpen())
{
// Do the stuff
}
}
但这是不可能的,因为我应该将hInstance
和hPrevInstance
以及其他参数传递给WinMain
函数。 实际上,我设计了一个 Window 类,使窗口创建更容易一些。 我在 SFML 上看到了这个实现,但我不知道它是怎么做到的。
现在我正在使用通常的方式:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR, int)
{
Window App(hInst, hPrevInst, "Test", 640, 480);
while(App.IsOpen())
{
// Do the stuff
}
}
谢谢。
如果将以下内容添加到 Microsoft 链接器选项中,即使使用 Microsoft 工具,您也可以在“windows”应用程序(即 GUI 子系统 Windows 应用程序)中使用标准main
:
/subsystem:windows /ENTRY:mainCRTStartup
请注意,这对于 GNU 工具链不是必需的。
对于 Microsoft 工具,您也可以将其添加到主文件中:
#ifdef _MSC_VER
# pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif
James McNellis 告诉您如何获取 hInstance。
GetModuleHandle(NULL)
会给你hInstance
。 hPrevInstance
始终为NULL
。
首先, GetModuleHandle(0)
提供可执行文件的模块句柄,它与WinMain
的hInstance
参数相同。
使用 GNU 工具链(g++ 编译器),符合标准的代码就可以了。
但是,默认情况下,Microsoft 工具链仅接受控制台子系统可执行文件的符合标准的代码。 要使用此不符合标准的工具链创建 GUI 子系统可执行文件,使用标准main
,您必须指定调用标准main
的 Microsoft 运行时库入口点,即mainCRTStartup
。 对于命令行调用,这意味着……
cl myApp.cpp /link /entry:mainCRTStartup /subsystem:windows user32.lib
实际上,为了在命令行中工作,您可以简单地在LINK
环境变量中指定入口点:
set LINK=/entry:mainCRTStartup
…
cl myApp.cpp /link /subsystem:windows user32.lib
为 Visual Studio 创建类似的符合标准的设置可能是不可取的,因为某些 Visual Studio 项目类型(主要是 MFC)需要使用 Microsoft 的非标准WinMain
或wWinMain
。
hInstance
是“从不使用全局变量”经验法则的一个例外。 通常,没有变量实际上在逻辑上具有模块范围的作用域。 但是,根据定义, hInstance
具有完全模块范围的作用域,因此实际上最合乎逻辑的解决方案是为其创建一个全局变量并在WinMain
对其进行初始化。
正如其他人所建议的,您也可以使用GetModuleHandle(NULL)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.