繁体   English   中英

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

[英]Replacing WinMain() with main() function in Win32 programs

我在 StackOverflow 和 Google 上搜索了一点,但无法理解。 我想用这种类型的用户编程来启动我的应用程序:

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

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

但这是不可能的,因为我应该将hInstancehPrevInstance以及其他参数传递给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)提供可执行文件的模块句柄,它与WinMainhInstance参数相同。

使用 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 的非标准WinMainwWinMain

hInstance是“从不使用全局变量”经验法则的一个例外。 通常,没有变量实际上在逻辑上具有模块范围的作用域。 但是,根据定义, hInstance具有完全模块范围的作用域,因此实际上最合乎逻辑的解决方案是为其创建一个全局变量并在WinMain对其进行初始化。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM