Есть ли способ, которым rust-cargo помещает DLL-файл в исполняемую программу?

Я пишу инструмент, он может получить идентификатор устройства через dll и скопировать идентификатор в буфер обмена.

extern crate clipboard;
use clipboard::ClipboardProvider;
use clipboard::ClipboardContext;

extern crate libloading;
use libloading::{Library, Symbol};

use std::ffi::CStr;
use std::str;

type GetHylinkDeviceId = unsafe fn() -> *const i8;

fn copy_to_clipboard(x3id: String) {
    let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap();
    println!("{:?}", ctx.get_contents());
    ctx.set_contents(x3id);
}

fn get_x3id() -> String {

    let library_path = "PcInfo.dll";
    println!("Loading add() from {:?}", library_path);

    let lib = Library::new(library_path).unwrap();

    let x3id = unsafe {

        let func: Symbol<GetHylinkDeviceId> = lib.get(b"GetHylinkDeviceId").unwrap();

        let c_buf: *const i8 = func();
        let c_str: &CStr = unsafe { CStr::from_ptr(c_buf) };
        let str_slice: &str = c_str.to_str().unwrap();
        let str_buf: String = str_slice.to_owned();
        str_buf

    };
    x3id
}

fn main() {

    let x3id: String = get_x3id();
    println!("{:?}", x3id);

    copy_to_clipboard(x3id)

}

Он работает хорошо, я использую его для сборки грузов, автоматически генерирую исполняемый файл. Мне нужно поместить файл dll и exe в один и тот же каталог при запуске.

Я хочу знать, есть ли способ запаковать dll-файл в exe с помощью груза?


person solideo    schedule 04.09.2017    source источник
comment
Вы можете использовать макрос include_bytes!, а затем создать файл dll из данных. Дубликат этого вопроса   -  person red75prime    schedule 04.09.2017
comment
@red75prime Спасибо, я ищу много демо, они используют include_bytes! загрузку такого hosts файла, преобразование &static [u8] данных в &static str и вывод текста, я заметил, что Library::new() нужен параметр AsRef<OsStr>, но я не знаю, как преобразовать &static [u8] в AsRef<OsStr>. Я пытаюсь использовать str::from_utf8 для преобразования &static [u8] в &static str и &static str в OsStr, но что-то не так, когда &[u8] в &str (поток «основной» запаниковал при «Недопустимой последовательности UTF-8: недопустимая последовательность utf-8 из 1 байтов из индекса 2 ')   -  person solideo    schedule 05.09.2017
comment
Я думал, может быть, файл DLL не может преобразовать в utf-8, тогда как мне использовать dll при загрузке с include_bytes!   -  person solideo    schedule 05.09.2017