سؤال

هل يعرف أحد طريقة لإغلاق علبة الأقراص المضغوطة برمجيًا على نظام التشغيل Windows 2000 أو أعلى؟توجد علبة الأقراص المضغوطة المفتوحة، لكن يبدو أنني لا أستطيع إغلاقها خاصةً ضمن W2k.

أنا أبحث بشكل خاص عن طريقة للقيام بذلك من ملف دفعي، إن أمكن، ولكن استدعاءات واجهة برمجة التطبيقات (API) ستكون مناسبة.

هل كانت مفيدة؟

المحلول

إليك طريقة سهلة لاستخدام Win32 API:


[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
        protected static extern int mciSendString(string lpstrCommand,StringBuilder lpstrReturnString,int uReturnLength,IntPtr hwndCallback);

 public void OpenCloseCD(bool Open)
 {
    if (Open)
    {
        mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
    }
    else
    {
        mciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
    }
}

نصائح أخرى

أحب نوعًا ما استخدام DeviceIOControl لأنه يمنحني إمكانية إخراج أي نوع من محركات الأقراص القابلة للإزالة (مثل USB وأقراص الفلاش بالإضافة إلى أدراج الأقراص المضغوطة).Da codez لإخراج قرص بشكل صحيح باستخدام DeviceIOControl هو (فقط قم بإضافة معالجة الأخطاء المناسبة):

bool ejectDisk(TCHAR driveLetter)
{
  TCHAR tmp[10];
  _stprintf(tmp, _T("\\\\.\\%c:"), driveLetter);
  HANDLE handle = CreateFile(tmp, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
  DWORD bytes = 0;
  DeviceIoControl(handle, FSCTL_LOCK_VOLUME, 0, 0, 0, 0, &bytes, 0);
  DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, 0, 0, 0, 0, &bytes, 0);
  DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, &bytes, 0);
  CloseHandle(handle);
  return true;
}

لقد لاحظت أن إجابة أندرياس ماجنوسون لم تعمل تمامًا مثل زر الإخراج في Explorer.على وجه التحديد، لم يكن محرك الأقراص باللون الرمادي في Explorer باستخدام رمز Andreas، ولكنه كان كذلك إذا استخدمت أمر الإخراج.لذلك قمت ببعض التحقيق.

قمت بتشغيل API Monitor أثناء تشغيل أمر الإخراج من Explorer (Windows 7 SP1 64 بت).لقد وجدت أيضًا مقالة MSKB جيدة رقم 165721 بعنوان كيفية إخراج الوسائط القابلة للإزالة في نظام التشغيل Windows NT/Windows 2000/Windows XP.الجزء الأكثر إثارة للاهتمام من مقالة MSKB مقتبس أدناه:

  1. اتصل بـ CreateFile باستخدام GENERIC_READ|GENERIC_WRITE وFILE_SHARE_READ|FILE_SHARE_WRITE وOPEN_EXISTING.يجب أن تكون المعلمة lpFileName \.\X:(حيث X هو حرف محرك الأقراص الحقيقي).جميع المعلمات الأخرى يمكن أن تكون صفراً.
  2. قم بقفل مستوى الصوت عن طريق إصدار FSCTL_LOCK_VOLUME IOCTL عبر DeviceIoControl.إذا كان أي تطبيق آخر أو النظام يستخدم وحدة التخزين، فسيفشل IOCTL هذا.بمجرد عودة هذه الوظيفة بنجاح، يضمن التطبيق عدم استخدام وحدة التخزين بواسطة أي شيء آخر في النظام.
  3. قم بإلغاء تحميل وحدة التخزين عن طريق إصدار FSCTL_DISMOUNT_VOLUME IOCTL.يؤدي هذا إلى قيام نظام الملفات بإزالة كافة المعلومات المتعلقة بوحدة التخزين وتجاهل أي معلومات داخلية يحتفظ بها بخصوص وحدة التخزين.
  4. تأكد من إمكانية إزالة الوسائط عن طريق إصدار IOCTL_STORAGE_MEDIA_REMOVAL IOCTL.قم بتعيين عضو PreventMediaRemoval في بنية PREVENT_MEDIA_REMOVAL إلى FALSE قبل استدعاء IOCTL هذا.يؤدي هذا إلى منع الجهاز من منع إزالة الوسائط.
  5. قم بإخراج الوسائط باستخدام IOCTL_STORAGE_EJECT_MEDIA IOCTL.إذا كان الجهاز لا يسمح بالإخراج التلقائي، فيمكن تخطي IOCTL_STORAGE_EJECT_MEDIA ويمكن توجيه المستخدم لإزالة الوسائط.
  6. أغلق مقبض وحدة التخزين الذي تم الحصول عليه في الخطوة الأولى أو قم بإصدار FSCTL_UNLOCK_VOLUME IOCTL.هذا يسمح باستخدام محرك الأقراص من قبل عمليات أخرى.

يمكن تلخيص إجابة أندرياس ومقالة MSKB واستنشاق واجهة برمجة التطبيقات الخاصة بي في Explorer على النحو التالي:

  1. CreateFile دعا لفتح وحدة التخزين.(جميع الطرق).
  2. DeviceIoControl دعا مع FSCTL_LOCK_VOLUME.(جميع الطرق).
  3. DeviceIoControl دعا مع FSCTL_DISMOUNT_VOLUME.(طرق Andreas وMSKB فقط.Explorer لا يستدعي هذا لسبب ما.يبدو أن IOCTL هو ما يؤثر على ما إذا كان محرك الأقراص باللون الرمادي في Explorer أم لا.لست متأكدًا من سبب عدم استدعاء Explorer لهذا).
  4. DeviceIoControl دعا مع IOCTL_STORAGE_MEDIA_REMOVAL و PREVENT_MEDIA_REMOVAL تعيين العضو ل FALSE (طرق MSKB و Explorer.هذه الخطوة مفقودة من إجابة أندرياس).
  5. DeviceIoControl دعا مع IOCTL_STORAGE_EJECT_MEDIA (مقال أندرياس وMSKB) أو IOCTL_DISK_EJECT_MEDIA (المستكشف؛لاحظ أن IOCTL هذا قد أصبح قديمًا وتم استبداله بـ STORAGE IOCTL.لست متأكدًا من سبب استمرار Explorer في استخدام الإصدار القديم).

في الختام، قررت اتباع الإجراء الموضح في مقالة MSKB، حيث يبدو أنه الإجراء الأكثر شمولاً واكتمالًا، مدعومًا بمقال MSKB.

نيركمد هي أداة مساعدة مجانية لسطر الأوامر سهلة الاستخدام للغاية مع خيارات متنوعة، بما في ذلك فتح وإغلاق علبة الأقراص المضغوطة.

لإغلاق درج محرك الأقراص، افعل كما هو موضح هنا ولكن بدلاً من استخدام DeviceIoControl مع IOCTL_STORAGE_EJECT_MEDIA، يتعين عليك الاتصال بـ DeviceIoControl مع IOCTL_STORAGE_LOAD_MEDIA.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top