小编Jos*_*ada的帖子

如何从 Rust 中的 WinMain 或 wWinMain 获取参数?

我正在尝试学习如何使用原始 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)

windows winapi ffi rust

6
推荐指数
2
解决办法
2075
查看次数

为什么 Rust 允许你在特征对象上调用 `Iterator::for_each()` ?

我正在研究一些 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)

rust trait-objects

6
推荐指数
1
解决办法
574
查看次数

标签 统计

rust ×2

ffi ×1

trait-objects ×1

winapi ×1

windows ×1