Kal*_*son 3 windows winapi rust windows-rs
我有一个 Windows 应用程序,带有用 Rust 和 winapi 编写的 GUI。尽管有 GUI,但它的行为就像控制台应用程序。当exe
文件启动时,Command Prompt
会弹出一个窗口,并从中运行应用程序。这不是我想要的;应该打开一个主窗口,就像在所有真正的桌面应用程序中一样。我如何使用 winapi 在 Rust 中实现这个目标?
我研究了一些选择。您可以使用Tauri或gtk-rs开发 Windows 桌面应用程序,但这两种技术在用于 Windows 应用程序时都有缺点。可以在这里找到更多选项。我还尝试了互联网上提供的windows-rs 示例,但它们都是带有图形用户界面的控制台应用程序,这不是我想要的。
我还注意到,C++ 桌面应用程序使用该函数int APIENTRY wWinMain(...)
作为入口点,而控制台应用程序使用int main(...)
, 并且wWinMain
在 rust winapi 中似乎不可用。
Subsystem
系统是否为新创建的进程分配控制台由Windows特定的可选PE标头中的字段控制。/SUBSYSTEM
该字段通过链接器的命令行选项填充。桌面应用程序的唯一相关参数是CONSOLE
和WINDOWS
。前者指示系统在启动时分配控制台,而后者则不会。
WINDOWS
您可以通过放置每个模块来指示链接器从 Rust 代码定位子系统
#![windows_subsystem = "windows"]
Run Code Online (Sandbox Code Playgroud)
应用程序主模块内的属性(请参阅windows-subsystem )。
您可以在板条箱的core_app示例中找到这样的示例windows
。
这是定位子系统的最方便的方法WINDOWS
。您还可以显式传递链接器标志,例如将以下覆盖放入.cargo/config.toml中:
[build]
rustflags = [
"-C", "link-arg=/SUBSYSTEM:WINDOWS",
]
Run Code Online (Sandbox Code Playgroud)
这可能有效,也可能无效,具体取决于您正在使用的链接器。由于链接器不是 Rust 工具链的一部分,因此您需要确保其正常工作并具有预期效果。
关于入口点函数名称的注释:就操作系统加载程序而言,它是无关紧要的。无论如何,它甚至从未进入最终的可执行映像。PE 映像仅存储 (image-base-relative) AddressOfEntryPoint
,并且该符号可以被命名为任何名称。
具体名称仅与生成相应链接器输入所涉及的构建工具相关。
更多信息请参见:WinMain 只是 Win32 进程入口点的常规名称。基本原则同样适用于 Rust,特别是用户定义的入口点 ( fn main()
) 实际上并不是可执行文件的入口点。