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

مشاهدة النسخة كاملة : استغلال cfgmgr32.dll وsetupapi.dll لتجهيز وتسيير وسائط النظام


kachwahed
25-06-2009, 06:39 AM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله

cfgmgr32.dll ، setupapi.dll هما مكتبتان للدوال المتعلقة بأجهزة النظام (توجدان في System32)، يجمع هذان الملفان مجموعة هامة الدوال المتعلقة بتثبيت وتسيير أجهزة النظام، وبواسطتهما يمكن الوصول إلى عدة وسائط على غرار COM Ports، DeviceManager، USBDrive...

طالع المزيد حول المكتبتين من MSDN
SetupAPI (http://msdn.microsoft.com/en-us/library/ms791318.aspx)
cfgmgr32 (http://msdn.microsoft.com/en-us/library/dd419830.aspx)

من أجل استغلال هذه الدوال قام بعض المبرمجين بإنشاء وحدات لاستدعائها من الدلفي، هناك مكون (منفرد) لمكتبة المكونات Jedi يقوم باستغلال هذه مجموعة من هذه الدوال، تجدونه من هنا (http://downloads.sourceforge.net/jedi-apilib/SetupAndConfigManagerAPI.zip).
لكن المكون يتطلب تثبيت المكتبة بكاملها لأجل بعض الثوابت والأنماط، لذلك قمت باستخراج هذه الوحدات وإضافة ما ينقصها حتى تصبح سهلة للاستعمال، تجدونها المرفقات Units.
انطلاقا من هذه الوحدات قمت بتعديلات عليها وأعددت مثال صغير حول طريقة الاستخدام، بريمج يعرض جميع الأقراص السريعة الموصلة بالحاسب مع الرقم التسلسلي الفيزيائي :D، مع زر يمكنك من سحب القرص في وضع آمن USB Drive Safe Removal، في المرفقات ملف تنفيذي ومصدره.
ملاحظة: بعض المبرمجين يستعمل الرقم الفيزائي للقرص السريع لتوزيع برنامجه (نسخة لكل قرص).
http://i41.tinypic.com/xkod3n.jpg

STRELiTZIA
29-06-2009, 08:57 PM
السلام عليكم و رحمة الله
بارك الله فيك اخي كاش واحد :)

بعض الملاحظات :
- الأداة تظهر حرف A الخاص بــ Floppy في الأجهزة التي تحتوي على قارئ الأقراص المرنة.
- عند تشغيل الأداة قبل ربط الــ Flash Memory لا يتم الفحص.

الاقتراحات :
- استعمال Timer و الأفضل Thread يقوم بالفحص الدوري و ارسال النتائج.


تجدونها المرفقات Units
ارفقت ملفات includes التي تعمل مع الوحدات دون الحاجة الى تثبيت مكونات JEDI

بالتوفيق ان شاء الله

kachwahed
29-06-2009, 10:53 PM
وفيكم بارك الله إخوتي جميعا
وعليكم السلام ورحمة الله وبركاته أخي STRELiTZIA
- الأداة تظهر حرف A الخاص بــ Floppy في الأجهزة التي تحتوي على قارئ الأقراص المرنة.
معك حق، لأنه يضاف كقيمة ثابتة، كان في يجدر بي أن أحذفه.

- عند تشغيل الأداة قبل ربط الــ Flash Memory لا يتم الفحص.
لأن الفحص يتم بشكل غير ديناميكي، استعمال Thread يقوم بالمراقبة فكرة رائعة...
هناك حدث Windows مخصص لذلك:
procedure WMDeviceChange(var Msg: TWMDeviceChange); message WM_DEVICECHANGE;
برأيي، استعماله أولى من Thread، إني بصدد تحضيره.
ارفقت ملفات includes التي تعمل مع الوحدات دون الحاجة الى تثبيت مكونات JEDI
لقد حذفت Includes من الوحدات عمدا:
{/$I jediapilib.inc}

هل تجب إضافتها حتى نستتخدم Units، أظنها تحتوي على فحوصات غير ضرورية:
{$DEFINE WINXP}

سأوافيكم بالجديد إن شاء الله.

kachwahed
30-06-2009, 01:03 PM
التحديث في المرفقات: إضافة الحدث WM_DEVICECHANGE لفحص إدخال أو سحب قرص USBDrive، بارك الله فيك أخي STRELiTZIA.

STRELiTZIA
01-07-2009, 01:28 PM
سأوافيكم بالجديد إن شاء الله.

الآن ما شاء الله اصبح كامل متكامل :)

الاقتراحات المملة: :D:D:D
في هذه المرحلة يجب تطويره الى مكون Component سيكون رائع...
مع اضافة خاصية Enabled و احداث مهمة مثل : OnUSBDeviceConnect و OnUSBDeviceDisconnect

بالتوفيق ان شاء الله

kachwahed
05-07-2009, 08:11 PM
السلام عليكم
معذرة على التأخير...
في هذه المرحلة يجب تطويره الى مكون Component سيكون رائع...
المكون جاهز، مفتوح المصدر (Unit) لمن أراد تطويره :D، يعمل على D7 حتى D2009
اكتفيت بحدث OnDeviceChange وبعض الخصائص مثل Enabled والإجراءات...
البقية وطريقة الاستعمال في المثال...
والمثال مع المكون في المرفقات ;)
بالتوفيق.

Ahmed18
24-12-2009, 11:24 PM
بارك الله فيك اخي kachwahed لا اعرف كيف اشكرك علي هذا المكون الرائع.
لكن جربت المثال علي نسخة Windows Seven ولكن لا يعمل حيث لا يقوم بعمل Safe Remove لل USB

kachwahed
25-12-2009, 07:55 AM
لكن جربت المثال علي نسخة Windows Seven ولكن لا يعمل حيث لا يقوم بعمل Safe Remove لل USB
مؤكد... لأنه يستخدم دوال API وملفات النظام الخاصة بالـ XP، الآن يجب تحديثها لتتوافق مع Win7، لم أثبت Win7 بعد، لك أن تستكشف وتقوم بالمغامرة ;).

Ahmed18
25-12-2009, 01:12 PM
الأمر الغريب ان المكتبات موجودة في Windows 7 في ال system32 لذلك من المفترض ان يعمل !
كنت اعتقد ان المشكلة مشكلة صلاحيات Privilege لذلك جربت استخدام الكود هكذا:

SetPrivilege('SeUndockPrivilege', true);
CM_Request_Device_Eject(DEVINST(USBDrives.Objects[Drive]),@VetoType, nil, 0, 0);
SetPrivilege('SeUndockPrivilege', False);

لكن لم يحدث اي تغيير.
-
علي اي حال سأبحث في هذا الامر واذا توصلت لشئ سأضع النسخة المتوافقة مع Win7 هنا ان شاء الله.

NadirSoft
03-11-2010, 06:18 PM
مشكور يااخي يعمل 100/100 على دالفي 5 بنضام ويندوز sp3 مع العلم يجب تنصيب المكونات