作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 Rust 调用 Win32 API CertOpenSystemsStoreW
和 CertCloseStore
函数。当我这样做时,我在 CertCloseStore
上遇到访问冲突,所以我想我在某些参数类型上的大小有误,但我看不到它。
以下 Python 代码有效(我有等效的 C++,但包含的不那么好):
In [1]: import ctypes
In [2]: c32 = ctypes.windll.crypt32
In [3]: c32.CertOpenSystemStoreW.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p]
In [4]: c32.CertOpenSystemStoreW.restype = ctypes.c_void_p
In [5]: c32.CertCloseStore.argtypes=[ctypes.c_void_p, ctypes.c_ulong]
In [6]: s = c32.CertOpenSystemStoreW(0, "my")
In [7]: c32.CertCloseStore(s, 0)
Out[7]: 1
这是失败的 Rust:
extern crate libc;
use libc::{c_ulong, c_int, c_void};
use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
use std::ptr::null;
type HPROVIDER = c_void;
type HCERTSTORE = c_void;
type BOOL = c_int;
#[link(name = "Crypt32")]
extern "stdcall" {
fn CertOpenSystemStoreW(
hProv: *const HPROVIDER, szSubsystemProtocol: *const u16) -> HCERTSTORE;
fn CertCloseStore(
hCertStore: HCERTSTORE, dwFlags: c_ulong) -> BOOL;
}
fn to_utf16(s: &str) -> Vec<u16> {
let os_s = OsStr::new(s);
return os_s.encode_wide().chain(Some(0).into_iter()).collect::<Vec<_>>();
}
fn main() {
let protocol_utf16 = to_utf16("my");
let storehandle;
unsafe {
storehandle = CertOpenSystemStoreW(null(), protocol_utf16.as_ptr());
}
let freeresults;
unsafe {
freeresults = CertCloseStore(storehandle, 0);
}
println!("{}", freeresults);
}
我正在使用 Rust 1.16。
最佳答案
嗯,有两个问题:
c_void
不是指针类型 - 它只是一个 u8
。所以我上面的代码应该类似于 type HPROVIDER = *const c_void;
(这不是很好,因为它使所有 HPROVIDER 都成为常量,但我没有看到一种方法来做一个 Rust 风格的指针typedef 而无需指定“mut”或“const”)。关于winapi - CertOpenSystemsStoreW 或 CertCloseStore 的 Rust FFI 声明有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43457189/
我正在尝试从 Rust 调用 Win32 API CertOpenSystemsStoreW 和 CertCloseStore 函数。当我这样做时,我在 CertCloseStore 上遇到访问冲突,
我是一名优秀的程序员,十分优秀!