如何将 Win32 合并到 SDL 项目中?
Posted
技术标签:
【中文标题】如何将 Win32 合并到 SDL 项目中?【英文标题】:How to incorporate Win32 in an SDL project? 【发布时间】:2014-11-22 21:41:22 【问题描述】:我使用 SDL 和 OpenGL 制作了一些软件,现在我想添加一个用于输入的图形界面,例如一些文本框和按钮。我意识到这可能必须在一个单独的窗口中,我不介意,但我不知道如何在我的项目中合并 Win32 功能。我尝试从
更改我的主要功能的定义int main(int argc, char **argv)
...
到
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int cmdShow)
...
但我收到一条错误消息:
LNK2005: _WinMain@16 already defined in SDL2main.lib (SDL_windows_main.obj)
LNK2005: _WinMain@16 already defined in Source.obj
LNK2019: unresolved external symbol _SDL_main referenced in function _main
我正在使用 Visual Studio 2012。 有没有办法解决这个问题,或者有没有另一种方法可以在 c++ 中创建表单?
谢谢
【问题讨论】:
GUI 不必位于单独的窗口中。您只需要可以呈现到 opengl 的小部件。有 gui 库可以做到这一点。 【参考方案1】:SDL 将main
定义为宏。这就像终极恐怖表演。当然,将 Microsoft 的 WinMain
怪物混入其中似乎是合适的,但任何事情都不需要它。
只需保留您的main
。
如果我承诺使用 SDL(考虑到上述情况,我永远不会这样做),那么我首先会检查 SDL 以文本框和按钮等方式提供的功能。如果没有,那么只需正确包含<windows.h>
(首先定义STRICT
和NOMINMAX
和UNICODE
),然后使用API。但为此,我建议首先通过创建一些纯 API 程序来学习该 API,不要干扰 SDL。
【讨论】:
为了扩展它——因为似乎WinMain
已经被库定义了,你可以继续使用main
。如果您不需要控制台,只需更改可执行输出类型(在项目链接器设置下)。
你所说的“使用主要”是什么意思?如果我使用现有的 main 函数,我如何拥有 Win32 功能,我从哪里获得我的 hInstance 和东西?
@HarWiltz:实例句柄大多只用于资源。如果您有资源,调用GetModuleHandle(0)
会检索当前可执行文件的实例句柄。将 DLL 名称传递给它以获取某个加载的 DLL 的实例句柄。针对新问题提出新的 SO 问题。 SO cmets 被设计为不支持讨论,因此您可以想象一个教程在某种程度上超出了设计限制。
在弄乱你的程序之前,他们至少可以给你一个选择,比如 SDLmain 宏。这可能是出于便携性的原因。以上是关于如何将 Win32 合并到 SDL 项目中?的主要内容,如果未能解决你的问题,请参考以下文章
Win32 使用 SetCurrentProcessExplicitAppUserModelID 关联多个进程 在任务栏合并 WPF 多进程窗口