我正在尝试使用Windows-RS库和ADSI API,遵循微软发布的C++示例,从Rust中与Active Directory一起工作。但是,我不太理解这里正在发生什么:
https://learn.microsoft.com/en-us/windows/win32/api/adshlp/nf-adshlp-adsopenobject
他们创建了一个未初始化的IADs指针(从我的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() {
...
}
}
Ok(())
}
首先,我可能错误地创建了一个空指针,因为这不是示例中所做的,但问题在于Rust不允许使用未初始化的变量,所以我不确定等价物是什么。
其次,假设pADs变量是输出应该去的地方,但我不理解拥有者为空的对象有一个指针,然后是双重指针的交互。即使在Rust中可能存在这种情况,我觉得这不是我应该做的事情。
第三,一旦我通过FFI调用更新了指针,如何告诉Rust结果输出类型,以便我们可以进一步处理它?使用_无法工作,因为它是一个结构体,并且我有一种使用transmute是不好的感觉。
*IADs
的具体类型,则可以将其转换为*IADsTypeBar
。 - kmdreko