الوثائق
قناة الاتصال الرسمية: #windows-dev على خلاف مجتمع الصدأ
يوفر هذا الصندوق روابط FFI الخام لجميع واجهة برمجة تطبيقات Windows. يتم جمعها باليد باستخدام Windows 10 SDK من Microsoft. أهدف إلى استبدال جميع Windows FFI الموجودة في الصناديق الأخرى بهذا القفص من خلال تقنية "احتضان ، تمديد ، وإطفاء".
إذا فقد هذا الصندوق شيئًا تحتاجه ، فلا تتردد في إنشاء مشكلة ، أو فتح طلب سحب ، أو الاتصال بي عبر وسائل أخرى.
يعتمد هذا الصندوق على الصدأ 1.6 أو الأحدث على النوافذ. على المنصات الأخرى ، يكون هذا الصندوق محظورًا وينبغي أن يتم تجميعه مع Rust 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 في مشاريعك؟ إذا كان الأمر كذلك ، فقد تكون مهتمًا بدعمني مالياً على باتريون. يتم تشجيع الشركات على وجه الخصوص على التبرع (أنا أنظر إليك Microsoft).