我在Rust中使用windows
crate来检索给定升级代码的相关产品列表,但是我的代码返回了error 87 (-2147024809) The parameter is set incorrectly
。
我试着这样做:
use windows::Win32::System::ApplicationInstallationAndServicing::MsiEnumRelatedProductsA;
use winapi::shared::winerror::HRESULT_FROM_WIN32;
fn main() {
let upgrade_code = "23170F69-40C1-2702-0000-000004000000";
// Enumerate related products and print their names
let mut index = 0;
loop {
let mut product_buf = vec![0u8; 1024];
let result = unsafe {
MsiEnumRelatedProductsA(
windows::core::PCSTR(upgrade_code.as_ptr()),
0,
index,
windows::core::PSTR(product_buf.as_mut_ptr()),
)
};
if result == 0 {
// Convert the null-terminated byte array to a string and print the results
let product_list = String::from_utf8(product_buf).unwrap_or("".to_string());
println!("Related products: {}", product_list);
break;
} else if result != 259 { //259 = No additional data available
println!("Error code: {} ({})",result, HRESULT_FROM_WIN32(result));
break;
}
index += 1;
}
}
1条答案
按热度按时间jyztefdp1#
这里有两个不相关的问题:
1.升级代码需要用花括号括起来。
MsiEnumRelatedProductsA
的文档在其输出缓冲区的描述中提供了提示。它需要容纳38个字符的空间,比GUID字符串文本当前的多两个字符。为了解决这个问题,你必须引入花括号,以及一个显式的零结束符(
\0
)。使用最少更改量的解决方案就像替换与
你也可以使用
windows
crate提供的s!
宏,它在编译时构造一个PCSTR
,也是零终止的,所以没有人会受到伤害:不过我还是建议做一些修改,特别是使用Unicode(UTF-16)API以及正确的错误报告。一个完整的实现可能看起来像这样: