我正在嘗試使用官方windows rust bindings從 windows 注冊表中讀取一個值。
我嘗試了很多不同的東西都沒有成功,所以我創建了一個 C 版本作為健全性測驗:
WCHAR value[64];
PVOID pvData = value;
DWORD size = sizeof(value);
LSTATUS result = RegGetValue(
HKEY_CURRENT_USER,
L"SOFTWARE\\MyTest\\foo",
NULL,
RRF_RT_REG_SZ,
NULL,
pvData,
&size);
if (result == ERROR_SUCCESS) {
wprintf(L"Value data: %s (%d)\n", (PWSTR)pvData, size);
}
這按預期作業并列印Value data: hello (12)(這并不完美,但最終結果至少顯示了一條沒有清理的作業快樂路徑。)
我最近的 Rust 嘗試是:
unsafe {
let mut value: Vec<u16> = vec![0; 64];
let mut my_size: u32 = 0;
let size = &mut my_size as *mut u32;
let result = RegGetValueW(
HKEY_CURRENT_USER,
"SOFTWARE\\MyTest\\foo",
None,
RRF_RT_REG_SZ,
std::ptr::null_mut(), // Doesn't allow None
value.as_mut_ptr() as *mut c_void,
size
);
println!("Result: {:?}", result);
println!("Value data: {:?} ({:?})", value, *size);
// Result: LSTATUS(234) // 234 = ERROR_MORE_DATA, so pvData is not large enough
// Value data: [0, 0, ...] (14) // 14 is peculiar given the C size reports 12
}
非常感謝一些指導或朝著正確方向輕推!
uj5u.com熱心網友回復:
我有兩個主要問題需要解決:
WCHAR 將是一個 u16 in rust
我正在使用 u8
let mut value: Vec<u16> = vec![0; 64];
使用時,
u16我還需要更改傳遞給的大小RegGetValueW
let mut my_size = (std::mem::size_of::<u16>() * value.len()) as u32;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/344030.html
