- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 EvtSubscribe
订阅 Windows 事件来自 the winapi crate ,但我收到了 ERROR_INVALID_PARAMETER
。
我在 Rust 中找不到示例,但确实找到了 C++ example .
我的生成 ERROR_INVALID_PARAMETER
的代码:
fn main() {
unsafe {
let mut callback: winapi::um::winevt::EVT_SUBSCRIBE_CALLBACK = None;
let mut session = std::ptr::null_mut();
let mut signal_event = std::ptr::null_mut();
let mut bookmark = std::ptr::null_mut();
let mut context = std::ptr::null_mut();
let channel_path = "Security";
let channel_path: winnt::LPWSTR = to_wchar(channel_path);
let query = "Event/System[EventID=4624]";
let query: winnt::LPWSTR = to_wchar(query);
let event_handle = winevt::EvtSubscribe(
session,
signal_event,
channel_path,
query,
bookmark,
context,
callback,
winevt::EvtSubscribeStartAtOldestRecord,
);
//println!("{:?}", &event_handle);
println!("{:?}", &winapi::um::errhandlingapi::GetLastError());
} //unsafe end
}
fn to_vec(str: &str) -> Vec<u16> {
return OsStr::new(str)
.encode_wide()
.chain(Some(0).into_iter())
.collect();
}
fn to_wchar(str: &str) -> *mut u16 {
return to_vec(str).as_mut_ptr();
}
最佳答案
EvtSubscribe
的文档状态:
SignalEvent
[...] This parameter must be
NULL
if theCallback
parameter is notNULL
.
Callback
[...] This parameter must be
NULL
if theSignalEvent
parameter is notNULL
.
此处未明示的含义是必须提供这些参数中的一个。明确禁止同时传递两者,但两者都不传递是没有意义的,否则您的代码将无法接收事件。
传递这些值之一应该会导致代码开始工作。
在编辑方面,这是一个很好的例子,说明 Rust 枚举本可以更好地为 API 建模。这将清楚地表明这两个选项是相互排斥的,并且需要一个:
enum Subscriber {
EventObject(HANDLE),
Callback(EVT_SUBSCRIBE_CALLBACK),
}
顺便说一句,您对 to_wchar
的实现不正确,可能会导致内存不安全。 to_vec
分配内存,你拿一个指向它的指针,然后释放内存,创建一个悬空指针。错误指针由 unsafe
block 内的 C 代码读取——这是需要 unsafe
的部分原因。
您要么需要使用mem::forget
,如How to expose a Rust `Vec<T>` to FFI? 所示。 (然后您需要以某种方式防止内存泄漏),或者您需要引用数据而不是获取原始指针。
关于winapi - 如何使用 Rust 和 winapi crate 在 Windows 中创建事件订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57663035/
我正在将 parking_lot 添加到我的项目中,我希望我的依赖项也可以选择使用它来使用它。 例如,我知道 Tokio 有一个启用 parking_lot 的功能标志,但我想找到所有具有相似功能标志
我想使用 dijkstra来自 pathfinding crate 的函数: pub fn dijkstra( start: &N, neighbours: FN, succe
我有一个 Rust 项目,它在一个工作区中分为多个 crate 。其中一个 crate 是一个测试 crate,它包含用于其他 crate 中的单元和集成测试的实用程序。 在一个 crate 中,我定
此测试代码(playpen): use std::fmt::{Display, Formatter, Error}; struct MyLocalType; type MyResult = Resul
我不小心将我的私有(private)箱子发布到了 crates.io。我该如何删除它?我检查了 documentation但似乎没有办法删除已发布的 crate 。 最佳答案 预防 为避免将来出现这种
有什么比将所有内容都放在同一个模块中更好的方法吗? sub_module.rs pub struct GiantStruct { /* */ } impl GiantStruct { // t
我正在使用Cargo::Ops::Compile()函数使用Cargo::Ops::Compile()函数构建铁锈项目。我在一个json文件中也有一个定制目标。。如何使用目标文件将项目构建到正确目标?
使用hyper crate,我向端点发出了HTTP请求,然后尝试将响应主体传递给期望参数为Futures crate Stream的第三方库。 这导致类型错误。 Cargo.toml [depende
在示例中,hs 从 std 重新导出 HashSet。但它编译时没有错误或警告。为什么? #![no_std] pub use hs::HashSet; pub fn new() -> HashSet
在阅读官方书籍时,我偶然发现了包裹和 crate 。要创建一个新的“项目”,这就是我运行的: $ cargo new my-project Created binary (applicati
在示例中,hs 从 std 重新导出 HashSet。但它编译时没有错误或警告。为什么? #![no_std] pub use hs::HashSet; pub fn new() -> HashSet
我正在尝试编写一些调试辅助宏。所以我创建了一个 crate 来容纳所有这些,并使用 phase(plugin) 在外部引用该 crate : #[cfg(test)] #[phase(plugin)]
每次我看到这样的错误: error: associated constants are experimental (see issue #29646) ... = help: add #![featu
我对 crates.io 上托管的确切内容有点困惑(“ crate ”是指代这些内容的正确方式吗)?我的理解是 crate 是 Rust 中的一个编译单元,但是 crates 和 crates.io
我今天开始学习 Rust,但我卡在了 this step .我想在我的项目中使用 rand crate,所以我按照教程中的建议更新了我的 Cargo.toml: [package] name = "g
我有一个包含大量代码的箱子,所以我将其拆分为多个文件/模块。然而,一些模块有内部不安全的东西(例如原始指针),我需要向不同的模块公开,但我不想暴露给我的 crate 的用户。我该怎么做? 我能想到的唯
我有一个包含大量代码的箱子,所以我将其拆分为多个文件/模块。然而,一些模块有内部不安全的东西(例如原始指针),我需要向不同的模块公开,但我不想暴露给我的 crate 的用户。我该怎么做? 我能想到的唯
Rust 文档中讨论 patching 的部分解释了如何实现补丁,但它使用的所有示例都是为了“测试”和短期修复。我想做的是为我依赖的其中一个 crate 打一个补丁,它会增加它的子依赖性,然后我想在
This question already has answers here: Unable to read file contents to string - Result does not imp
我正在尝试在 Rust 中创建一个模块,然后从不同的文件中使用它。这是我的文件结构: matthias@X1:~/projects/bitter-oyster$ tree . ├── Cargo.lo
我是一名优秀的程序员,十分优秀!