Я пишу инструмент, он может получить идентификатор устройства через 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 с помощью груза?
include_bytes!
, а затем создать файл dll из данных. Дубликат этого вопроса - person red75prime   schedule 04.09.2017include_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.2017include_bytes!
- person solideo   schedule 05.09.2017