我正在尝试通过遵循 Microsoft 为 ADSI API 和 Windows-RS 板条箱发布的 c++ 示例来使用 Rust 的活动目录。我不太明白这里发生了什么:
https://docs.microsoft.com/en-us/windows/win32/api/adshlp/nf-adshlp-adsopenobject
他们创建了一个指向 IAD 的未初始化指针(从我的 C# 知识中得出,它看起来像一个接口)然后,当需要使用它时,他们有一个双指针,它被强制转换为 void。我试图在 Rust 中复制这种行为,但我想我只是不明白发生了什么。这是我迄今为止尝试过的:
// bindings omitted
use windows::Interface;
use libc::c_void;
fn main() -> windows::Result<()> {
let mut pads: *mut IADs = ptr::null_mut();
let ppads: *mut *mut c_void = pads as _;
unsafe {
let _ = CoInitialize(ptr::null_mut());
let mut ldap_root: Vec<u16> = "LDAP://rootDSE\0".encode_utf16().collect();
let hr = ADsOpenObject(
ldap_root.as_mut_ptr() as _,
ptr::null_mut(),
ptr::null_mut(),
ADS_AUTHENTICATION_ENUM::ADS_SECURE_AUTHENTICATION.0 as _,
& IADs::IID,
ppads,
);
if !hr.is_err() { …Run Code Online (Sandbox Code Playgroud) 我试图一次对多个字符串块执行并行操作,并且发现借用检查器存在问题:
(对于上下文,identifiers是Vec<String>来自 CSV 文件的,client是 reqwest,target是Arc<String>一次写入多次读取的)
use futures::{stream, StreamExt};
use std::sync::Arc;
async fn nop(
person_ids: &[String],
target: &str,
url: &str,
) -> String {
let noop = format!("{} {}", target, url);
let noop2 = person_ids.iter().for_each(|f| {f.as_str();});
"Some text".into()
}
#[tokio::main]
async fn main() {
let target = Arc::new(String::from("sometext"));
let url = "http://example.com";
let identifiers = vec!["foo".into(), "bar".into(), "baz".into(), "qux".into(), "quux".into(), "quuz".into(), "corge".into(), "grault".into(), "garply".into(), "waldo".into(), "fred".into(), "plugh".into(), "xyzzy".into()];
let id_sets: Vec<&[String]> …Run Code Online (Sandbox Code Playgroud)