私はwinapi-rs経由でC FFI経由でWindows APIを利用するプログラムを持っています。関数の1つは、文字列へのポインタへのポインタが出力パラメータとして期待されます。この関数は、結果をこの文字列に格納します。私はこの文字列にタイプWideCString
の変数を使用しています。可変参照を渡すか、FFIのコンテキストで変数の所有権を移すべきですか?
可変機能のrefを安全に文字列に(ちょうど安全でないブロック内の)この関数に渡すことはできますか?(と.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サイドの機能が何を望んでいるのかまだ分かりませんから。 –
ショートバージョン、いくつかのコードを表示します。 –