我正在尝试学习如何使用原始 Win32 API,并且正在按照此处的教程进行操作,但我无法弄清楚如何传递int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)函数签名来工作。我确实知道int WINAPI不需要...但是如何将所有这些参数传递给 WinAPI 调用?特别是 hInstance 和 nCmdShow?
从中获取 hInstance 和 nShowCmd
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {}
Run Code Online (Sandbox Code Playgroud)
进入 Rust 程序,也许是这样的:
fn main(/* args, such as hInstance, nShowCmd here /*) {
}
Run Code Online (Sandbox Code Playgroud)
或者,更可能的方式:
fn main() {
std::env::/* hopefully something like args() /*;
}
Run Code Online (Sandbox Code Playgroud)
我尝试获取 args,但这只是传递了我用来生成程序的命令行参数,就像 args[0] 是程序的名称一样,这是预期的行为。此外,调用 args_os() 也会得到相同的结果。
我也尝试过设置 Windows 子系统,但之前的行为是相同的,而不是所需的行为......
#![windows_subsystem = "windows"] …Run Code Online (Sandbox Code Playgroud) 我正在研究一些 API 概念,并注意到 Rust 的 Iterator 特性中有一些特殊之处。
我有以下特征定义:
trait Observable {
type Item;
fn subscribe<F>(self, f: F) -> bool
where
Self: Sized,
F: FnMut(Self::Item) + 'static;
}
Run Code Online (Sandbox Code Playgroud)
然后我继续编写以下测试:
#[test]
#[should_panic]
fn trait_obj() {
let mut v: Vec<Box<dyn Iterator<Item = ()>>> = vec![];
let mut v2: Vec<Box<dyn Observable<Item = Ref<u8>>>> = vec![];
v.remove(0).for_each(|_| {});
v2.remove(0).subscribe(|_| {});
}
Run Code Online (Sandbox Code Playgroud)
正如人们所期望的那样,上述测试无法编译;subscribe()按值获取 self,并且对 具有Sized约束Self,因此不是对象安全的。但是,如果我注释掉该...subscribe行,它就会编译!
对我来说奇怪的是,Iterator::for_each()有相同的限制。为什么允许这样做Iterator而不是允许这样做Observable?这是一个实验性的功能吗?
Iterator::for_each这是供参考的函数签名:
// Iterator::for_each
fn for_each<F>(self, …Run Code Online (Sandbox Code Playgroud)