用Win32程序中的main()函数replaceWinMain()

我在StackOverflow和Google上search了一下,但是没有得到想法。 我想用这种types的用户编程来启动我的应用程序:

int main() { Window App("Test", 640, 480); while(App.IsOpen()) { // Do the stuff } } 

但这是不可能的,因为我应该将hInstance和hPrevInstance等parameter passing给WinMain函数。 其实有一个窗口类,我devise它使窗口创build更容易一点。 我在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)告诉你如何获得实际。

GetModuleHandle(NULL)会给你hInstancehPrevInstance始终为NULL

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

使用GNU工具(g ++编译器),符合标准的代码是OK的。

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

 cl myApp.cpp /link /entry:mainCRTStartup /subsystem:windows user32.lib 

实际上,为了在命令行中工作,您可以简单地在LINK环境variables中指定入口点:

 set LINK=/entry:mainCRTStartup 

 cl myApp.cpp /link /subsystem:windows user32.lib 

为Visual Studio创build类似的符合标准的安装程序可能不是所希望的,因为一些Visual Studio项目types(主要是MFC)需要使用Microsoft的非标准WinMainwWinMain

hInstance是“从不使用全局variables”经验法则的一个例外。 通常情况下,逻辑上没有variables的范围是模块范围的。 然而, hInstance具有模块范围的定义,所以实际上最合理的解决scheme是为它创build一个全局variables并在WinMain初始化它。

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

简单:

 #define MainCode int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow) MainCode { .... your code here .... } 

您可以将第一行隐藏在另一个文件中