用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)
会给你hInstance
。 hPrevInstance
始终为NULL
。
首先, GetModuleHandle(0)
提供可执行文件的模块句柄,与WinMain
的hInstance
参数相同。
使用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的非标准WinMain
或wWinMain
。
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 .... }
您可以将第一行隐藏在另一个文件中