เอกสาร
ช่องทางการสื่อสารอย่างเป็นทางการ: #windows-dev บนความไม่ลงรอยกันของชุมชนสนิม
ลังนี้ให้การผูก FFI ดิบกับ Windows API ทั้งหมด พวกเขาถูกรวบรวมด้วยมือโดยใช้ Windows 10 SDK จาก Microsoft ฉันตั้งเป้าหมายที่จะแทนที่ Windows FFI ที่มีอยู่ทั้งหมดในลังอื่น ๆ ด้วยลังนี้ผ่านเทคนิค "โอบกอดขยายและดับ"
หากลังนี้หายไปสิ่งที่คุณต้องการอย่าลังเลที่จะสร้างปัญหาเปิดคำขอดึงหรือติดต่อฉันผ่านทางอื่น
ลังนี้ขึ้นอยู่กับสนิม 1.6 หรือใหม่กว่าบนหน้าต่าง บนแพลตฟอร์มอื่น ๆ ลังนี้ไม่มีและควรรวบรวมด้วยสนิม 1.2 หรือใหม่กว่า
ใช้ std::mem::zeroed() เพื่อสร้างอินสแตนซ์ของสหภาพจากนั้นกำหนดค่าที่คุณต้องการโดยใช้หนึ่งในวิธีการแปรผัน
แต่ละโมดูลจะได้รับการตั้งค่าบนธงฟีเจอร์ดังนั้นคุณต้องเปิดใช้งานคุณสมบัติที่เหมาะสมเพื่อเข้าถึงรายการเหล่านั้น ตัวอย่างเช่นหากคุณต้องการใช้บางสิ่งบางอย่างจาก winapi::um::winuser คุณต้องเปิดใช้งานคุณสมบัติ winuser
คุณสามารถใช้ฟังก์ชั่นการค้นหาในเอกสารเพื่อค้นหาตำแหน่งที่กำหนดไว้
ลังนี้ไม่มีอะไรมากไปกว่าการผูกดิบกับ Windows API หากคุณต้องการทราบวิธีการใช้ฟังก์ชั่นต่าง ๆ ใน Windows API คุณสามารถค้นหารายการต่าง ๆ บน MSDN ซึ่งเต็มไปด้วยเอกสารที่มีรายละเอียด
no_std ได้หรือไม่? ใช่แน่นอน! โดยค่าเริ่มต้นคุณสมบัติ std ของ winapi ถูกปิดใช้งานช่วยให้คุณสามารถเขียนแอปพลิเคชัน Windows โดยใช้อะไรนอกจาก core และ winapi
HANDLE ของ winapi จึงเข้ากันไม่ได้กับ HANDLE ของ std ? เนื่องจาก winapi ไม่ได้ขึ้นอยู่กับ std โดยค่าเริ่มต้นจึงต้องกำหนด c_void ตัวเองแทนที่จะใช้ std::os::raw::c_void อย่างไรก็ตามหากคุณเปิดใช้งานคุณสมบัติ std ของ winapi มันจะส่งออก c_void จาก std อีกครั้งและทำให้ HANDLE ของ winapi เป็นประเภทเดียวกับ HANDLE ของ std
-sys เหล่านั้นเช่น kernel32-sys ? ไม่ลังเหล่านั้นเป็นมรดกของวิธีการจัดระเบียบ winapi 0.2 เริ่มต้นด้วย winapi 0.3 คำจำกัดความทั้งหมดอยู่ใน winapi โดยตรงและดังนั้นจึงไม่จำเป็นต้องใช้ -sys เหล่านั้นอีกต่อไป
cargo.toml:
[ target . 'cfg(windows)' . dependencies ]
winapi = { version = " 0.3 " , features = [ " winuser " ] }Main.rs:
# [ cfg ( windows ) ] extern crate winapi ;
use std :: io :: Error ;
# [ cfg ( windows ) ]
fn print_message ( msg : & str ) -> Result < i32 , Error > {
use std :: ffi :: OsStr ;
use std :: iter :: once ;
use std :: os :: windows :: ffi :: OsStrExt ;
use std :: ptr :: null_mut ;
use winapi :: um :: winuser :: { MB_OK , MessageBoxW } ;
let wide : Vec < u16 > = OsStr :: new ( msg ) . encode_wide ( ) . chain ( once ( 0 ) ) . collect ( ) ;
let ret = unsafe {
MessageBoxW ( null_mut ( ) , wide . as_ptr ( ) , wide . as_ptr ( ) , MB_OK )
} ;
if ret == 0 { Err ( Error :: last_os_error ( ) ) }
else { Ok ( ret ) }
}
# [ cfg ( not ( windows ) ) ]
fn print_message ( msg : & str ) -> Result < ( ) , Error > {
println ! ( "{}" , msg ) ;
Ok ( ( ) )
}
fn main ( ) {
print_message ( "Hello, world!" ) . unwrap ( ) ;
} คุณใช้ winapi ในโครงการของคุณหรือไม่? ถ้าเป็นเช่นนั้นคุณอาจสนใจที่จะสนับสนุนฉันทางการเงินใน Patreon โดยเฉพาะอย่างยิ่ง บริษัท โดยเฉพาะอย่างยิ่งได้รับการสนับสนุนให้บริจาค (ฉันกำลังมองหาคุณ Microsoft)