1

C FFI (winapi-rs 経由) 経由で Wi​​ndows API を利用するプログラムがあります。関数の 1 つは、文字列へのポインターへのポインターを出力パラメーターとして予期します。関数はその結果をこの文字列に格納します。この文字列にタイプの変数を使用していWideCStringます。

この関数 (unsafe ブロック内) の文字列への ref への変更可能な ref を "ただ" 渡すことはできますか、それとも変数の所有権を C 関数に移動する.into_raw()ような機能を使用する必要がありますか?.from_raw()

どちらのバージョンもコンパイルして動作しますが、直接的な方法で不利な点を購入しているのかどうか疑問に思っています.

.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)};

MSDN のこのパラメーターの説明には、次のように書かれています。

nullで終わるセキュリティ記述子文字列へのポインターを受け取る変数へのポインター。文字列形式の説明については、セキュリティ記述子文字列形式を参照してください。返されたバッファを解放するには、LocalFree関数を呼び出します。

関数が変数の値を変更することを期待しています。それは - 定義上 - 私が所有権を移動していることを意味しませんか?

4

1 に答える 1