المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : دوال واجهة برمجة التطبيقات Api


نجيب المجيدي
21-12-2003, 03:17 PM
السلام عليكم إخواني الأعزاء
أحب أن أدعوكم جميعاً
و أقصد هنا جميع اعضاء المنتدى لمناقشة هذا الموضوع مناقشة جادة نظراً لأهميته لكل من يحب عمل برامج لم يكن يحلم بعملها من قبل باستخدام لغة البرمجة لوحدها
وأدعو أيضاً من لهم خبرة في التعامل مع هذه الدوال لمناقشة آرائهم و الاستفادة من خبرتهم في هذا المجال
ولترتيب الطرح في هذا الموضوع أقترح الآتي:

1- طرح إحدى دوال API.
2- مناقشة الغرض من هذه الدالة ومتى يجب استخدامها وبالتالي
طريقة التصريح عنها .
3- مناقشة الاستخدامات الأخرى لهذه الدالة إن وجدت وكذا كيفية تمرير
القيم لها .
4- طرح المشاكل التي قد تتسبب بها الدالة وكيفية معالجتها .
5- مناقشة امكانية استخدام هذه الدالة مع كل نظام تشغيل على حده .

أي أن يكون هذا الموضوع مخصصاً لمناقشة كل ما يتعلق بدوال API
تمهيداً لتخصيص قسم خاص لها.
وهذا ما أنوي اقتراحه على الأخ المشرف ولكن بعد أن نثبت اهميتها وأن القسم الخاص بها لن يبقى مهجوراً (أليس كذلك:p )

العمراوي
21-12-2003, 06:14 PM
موضوع مهم للغاية .,.,.,.,

وعلى أي حال لو لاقى الموضوع الإهتمام المناسب من الأعضاء فسيثبت وأما على إنشاء منتدى خاص بها فلكل حدث حديث .,.,.,.,

وأنا مشارك في هذا الموضوع بقوة .,.,.,.,

Nora
21-12-2003, 08:20 PM
السلام عليكم ورحمة الله وبركاته .

بالفعل موضوع مهم لكن أنا بصراحة لا أدري كيف يتم البدء بالتعامل مع هذه الدوال بعد معرفة خصائصها من API Guid حيث أن الخوف يكمن في الاستخدام الخاطئ لهذه الدوال الذي قد يؤدي الى نتائج غير مرغوب فيها ...

لذلك طرح أمثلة برمجية عملت و أدت الغرض ( طبعا بعد مناقشة الغرض من هذه الدالة ومتى يجب استخدامها ) من ذوي الخبرة سيفيد كثيراً ...

3laa3sam
21-12-2003, 08:42 PM
ممتاز ....بس عارف حاجه مش كل دوال الAPI بتشتغل ع الويندوز وانا من شايف إن الاحسن الواحد ميلجئش ليها إلا بعد ما تزهق الروح ....!!!

العمراوي
23-12-2003, 07:35 AM
يا عزيزي علاء .,.,.,.,

دوال الApi تعتبر هي الوسيلة الأسرع والأحسن للتعامل مع الويندوز وأيضا الوسيلة الأكثر فعالية لكونها لا ترتبط بجهاز معين أو كونها لا ترتبط بOCX معين و كلها دوال موجوده في مكتبة الويندوز نفسه .,.,.,.,.,

ويالله يا شباب ورونا الهمة والتفاعل .,.,.,.,

نجيب المجيدي
23-12-2003, 05:15 PM
تحياتي للأخ المشرف و أشكر الأخ علاء على المشاركة
قد نتفق على أن بعض دوال واجهة برمجة التطبيقات تسبب مشاكل في عمق النظام ولكن هذه الدوال
إذا أحسنا استخدامها و ذلك بعد أن نعرف ماهية المشاكل التي تسببها ونعمل على منع ذلك باستخدام إجراءات
إضافية وأحياناً باستخدام دوال API أخرى وهذا ما نحن بصدده هنا في هذا الموضوع
أي دراسة هذه الدوال ومعرفة الاستخدام الأمثل لها.
وقد سبق وأشرت إلى أن استخدام هذه الدوال ليس عبطاً فهي مصممة أصلاً لتقوم بمهام معقدة في النظام لا يستطيع المبرمج
تأديتها باستخدام مهارات البرمجة العادية
إذاً لن يكون لديك الخيار أصلاً لتفضل شيءً آخر عليها وكذلك كما أشار الأخ المشرف فإنها لا ترتبط بأدوات معينة
وهي معرفة في جميع إصدارات الويندوز وهنا نأتي إلى مبدأ التوافقية المدعوم بشدة في هذه الدوال

ولكن يحدث في بعض الأحيان أن لا توجد المكتبة التي تدعم إحدى هذه الدوال وهنا نجد أننا يمكن أن نعثر على هذه
المكتبة في دقائق عن طريق الانترنت

إذاً ما المشكلة في استخدامها (في الحقيقة لا أستطيع أن أتخيل الفيجوال بيسك بدون دوال API)

وإذاً لنبدأ ...

أحب أن أبدأ بمقدمة بسيطة عن API Text Viewer
هذا هو برنامج بسيط لاستعراض دوال API يحمل ضمن CD فيجوال بيسك ويمكن أيضاً تحميله من الإنترنت
وبعد تشغيله نختار من قائمة ملف الأمر Load Text File ومن ثم نختار الملف Win32API.txt من مربع حوار الفتح
ونختار الزر فتح
يمكن بعد ذلك و كخطوة اختيارية نختار Convert Text to data**** لتحويل الملف إلى قاعدة بيانات لتوفير سرعة بحث أعلى ونحفظه
وبعد ذلك نختار الأمر
Load Data**** File و نحدد قاعدة البيانات win32api.mdb
في API Type نحدد الخيار Declars وذلك للبحث عن تصريحات الدوال أو Constants للبحث عن الثوابت التي تمرر
لبعض الدوال أو Types للبحث عن أنواع البيانات المعرفة للمستخدم و التي نحتاجها عند استخدام بعض الدوال


ولنبدأ بالمثال التالي :
نريد برنامج يقوم بإغلاق الويندوز وهذا يتضمن عمليات إعادة التشغيل و تسجيل الخروج ...
سنقوم بالبحث عن التصريح الخاص بالدالة ExitWindow*** وهو كالتالي :
Public Declare Function ExitWindow*** Lib "user32" Alias "ExitWindow***" (ByVal uFlags As Long, ByVal dwReserved As Long) As Longما علينا بعد ذلك إلا البحث عن الثوابت التي تحدد العملية المطلوبة هل نريد الإغلاق أو إعادة التشغيل إلخ....
وستكون الثوبت كالآتي :
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1نلا حظ أننا نستطيع استخدام الكلمة المحجوزة Public أو Private بحسب منطقة التعريف

وبعد اختيار الأمر Copy نقوم بلصق التصريحات في المكان الخاص بها في نافذة برمجة فيجوال بيسك
ونكتب الكود التالي مثلاً :
Private Sub Command1_Click()
ExitWindow*** EWX_SHUTDOWN, 0
End Sub
فهل من الممكن عمل ذلك بدون استخدام هذه الدالة


وبذا نكون قد انتهينا

عفواً أقصد بدأنا حيث أننا سنبدأ بمناقشة المشاكل التي قد تتسبب بها هذه الدالة إذا وجدت مشاكل وكذا تمرير الثوابت لها
وأنا في انتظار مشاركاتكم

( أفتقدك بشدة يارغيد وأتلهف لقراءة ماتكتبه )

3laa3sam
24-12-2003, 11:41 PM
معرفش ...محقق كونان بس أنا كان كل القصد أقول رئيي وبس وأنا ع فكره لسى مصمم إن الاحسن الواحد يبتعد من إستخدام (API) .
نجيب المجيدي ....باين عليك عندك إلمام مش بطال في اللغه دي وده شيء جميل جداً بصراحه يعني بس عارف حاجه بدايه الموضوع ده وحكايه الاستعاضه بشيء أخر عوضاً عن إستخدام ال(API) ده شيء جميل جداً.

عموماً....ربنا معاكم كلكم ويالا زي مقال المحقق كونان (ورونا الهمه والتفاعل).

نجيب المجيدي
25-12-2003, 04:31 PM
شكراً يا أخ علاء, بس على فكرة أنا مش بالشكل اللي انت متصوره أنا مجرد تلميذ
في هذا المجال ومعلوماتي سطحية
أنا فتحت باب النقاش هنا عشان نستفيد من بعض ولحد الآن أرى ان التفاعل اللي كنت اتصورة مش موجود
عموماً أشكرك انت و الأخ المحقق كونان على المشاركة وأقول ان فكرة تخصيص قسم لهذا الموضوع شكلها كانت ساذجة
يالله ... ما علينا

3laa3sam
25-12-2003, 09:30 PM
ياسيدي..مين قال كده، فكرتك كويسه بس لما يكون هناك في تفاعل ممتاز عموماً مش عاوز أديك وعد إني هشارك بس خليها للوقت .
وع فكره...إوعى تقول ع نفسك كلام زي ده من تاني , ماشي !!!

نجيب المجيدي
26-12-2003, 04:00 PM
وأنا في انتظار مشاركاتك يا علاء

نجيب المجيدي
07-01-2004, 05:31 PM
للقيام بإغلاق أو إعادة تشغيل
WindowsNT
أو
Windows2000
أو أي إصدار من ويندوز
وذلك باستخدام دالة الإغلاق في واجهة برمجة التطبيقات
نقوم بكتابة الكود التالي في قسم التصريحات الخاص بالفورم
Option Explicit
'نقوم هنا بتعريف
'DataType
'خاص بالمستخدم
Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type

'نبدأ هنا بكتابة الكود
'ونعرف هذه الثوابت
Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_FORCE As Long = 4
Private Const EWX_REBOOT = 2
'ثم نقوم بالتصريح عن الدوال الآتيه

Private Declare Function ExitWindow*** Lib "user32" ( _
ByVal dwOptions As Long, ByVal dwReserved As Long) As Long


Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" ( _
ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _
ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" ( _
ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _
NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
'====================================الإجراء الأول
Private Sub AdjustToken()

Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle

' التحايل على النظام لأخذ التصريح بالإغلاق
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid

tkp.PrivilegeCount = 1 ' إعداد تصريح واحد
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED

' جعل عملية الإغلاق ممكنه في هذه العملية

AdjustTokenPrivileges hdlTokenHandle, False, tkp, _
Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded

End Sub

Private Sub cmdForceShutdown_Click()
AdjustToken 'تنفيذ الإجراء السابق ومن ثم إغلاق الويندوز بنجاح
ExitWindow*** (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
End Sub

وبذا نكون قد كتبنا الكود كاملاً