У меня есть программа, которая использует Windows API через C FFI (через winapi-rs). Одна из функций ожидает указатель на указатель на строку в качестве выходного параметра. Функция сохранит результат в этой строке. Я использую переменную типа WideCString
для этой строки.Должен ли я передавать изменяемую ссылку или передавать право собственности на переменную в контексте FFI?
Может ли я «просто» пройти в изменяемом иом к иому на строку в эту функцию (внутри небезопасный блок), или я должен скорее использовать функциональные возможности, как .into_raw()
и .from_raw()
, который также перемещает собственность переменного к C функция?
Обе версии компилируются и работают, но мне интересно, покупаю ли я какие-либо недостатки с помощью прямого способа.
Вот соответствующие строки из моего кода, используя .into_raw
и .from_raw
.
let mut widestr: WideCString = WideCString::from_str("test").unwrap(); //this is the string where the result should be stored
let mut security_descriptor_ptr: winnt::LPWSTR = widestr.into_raw();
let rtrn3 = unsafe {
advapi32::ConvertSecurityDescriptorToStringSecurityDescriptorW(sd_buffer.as_mut_ptr() as *mut std::os::raw::c_void,
1,
winnt::DACL_SECURITY_INFORMATION,
&mut security_descriptor_ptr,
ptr::null_mut())
};
if rtrn3 == 0 {
match IOError::last_os_error().raw_os_error() {
Some(1008) => println!("Need to fix this errror in get_acl_of_file."), // Do nothing. No idea, why this error occurs
Some(e) => panic!("Unknown OS error in get_acl_of_file {}", e),
None => panic!("That should not happen in get_acl_of_file!"),
}
}
let mut rtr: WideCString = unsafe{WideCString::from_raw(security_descriptor_ptr)};
description of this parameter in MSDN говорит:
Указатель на переменную, которая получает указатель на -завершённый строку дескриптора безопасности в нуль. Описание формата строки см. В разделе Security Descriptor String Format. Чтобы освободить возвращенный буфер, вызовите функцию LocalFree.
Я ожидаю, что функция изменит значение переменной. Разве это не означает, что я принимаю участие?
Что указатель к указателю на строку в C в этом случае? «WCHAR **»?Что функция говорит, что это будет с этим связано? Возможно, вы можете сказать нам, какую функцию вы хотите назвать, чтобы мы могли найти ее в MSDN. –
@Shepmaster Не очень, так как я до сих пор не знаю, что функция C * хочет *. –
Краткая версия, показать код. –