我尝试导入GetBinaryTypeA
函数:
use std::ffi::CString;
use ::std::os::raw::{c_char, c_ulong};
extern { fn GetBinaryTypeA(s: *const c_char, out: *mut c_ulong) -> i32; }
fn main() {
let path = "absolute/path/to/bin.exe";
let cpath = CString::new(path).unwrap();
let mut out: c_ulong = 0;
println!("{:?}", cpath);
unsafe { GetBinaryTypeA(cpath.as_ptr(), out as *mut c_ulong); }
println!("{:?}", cpath);
}
输出:
error: process didn't exit successfully: `target\debug\bin_deploy.exe` (exit code: 3221225477)
Process finished with exit code -1073741819 (0xC0000005)
如果我设置了无效路径,那么它会成功执行,而GetLastError()
会返回2("系统找不到指定的文件"),所以它看起来像导入的函数有效。
我使用kernel32-sys crate收到了同样的错误。还有哪处可以出错?
答案 0 :(得分:2)
您正在将值0
转换为指针。在当今使用的绝大多数计算机上,值为0
的指针称为NULL
。因此,您试图写入NULL
指针,这会导致崩溃。
您想要写入值的地址:
&mut out as *mut c_ulong
哪个甚至不需要演员:
unsafe {
GetBinaryTypeA(cpath.as_ptr(), &mut out);
}