الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إدخال وإخراج الأقراص القابلة للنزع برمجيا

مغلق
بدأه محمد سامر أبو سلو في 9 أغسطس 2005 · 8 رد · 882 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إليكم الكود

Public Module EjectLoadRemovable

    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByRef lpSecurityAttributes As Long, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As Integer) As Integer
    Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Integer, ByVal dwIoControlCode As Integer, ByRef lpInBuffer As Object, ByVal nInBufferSize As Integer, ByRef lpOutBuffer As Object, ByVal nOutBufferSize As Integer, ByRef lpBytesReturned As Integer, ByRef lpOverlapped As Object) As Integer
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
    Private Const INVALID_HANDLE_VALUE As Short = -1
    Private Const OPEN_EXISTING As Short = 3
    Private Const FILE_FLAG_DELETE_ON_CLOSE As Integer = 67108864
    Private Const GENERIC_READ As Integer = &H80000000
    Private Const GENERIC_WRITE As Integer = &H40000000
    Private Const IOCTL_STORAGE_EJECT_MEDIA As Integer = 2967560
    Private Const IOCTL_STORAGE_LOAD_MEDIA As Integer = 2967564
    Private Const IOCTL_STORAGE_LOAD_MEDIA2 As Integer = 2951180
    Private Const VWIN32_DIOC_DOS_IOCTL As Short = 1

    ' To Eject Removable media just pass the drive letter to the sub
    Public Sub EjectRemovable(ByVal EjectDrive As String)
        Dim hDrive, DummyReturnedBytes As Integer
        Dim DriveLetterAndColon As String

        DriveLetterAndColon = UCase(Left(EjectDrive & ":", 2)) 'Make it all caps for easy interpretation
        hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
        If hDrive <> INVALID_HANDLE_VALUE Then
            'Eject media!
            Call DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, DummyReturnedBytes, 0)
            Call CloseHandle(hDrive) 'Clean up after ourselves
        End If

    End Sub

    ' To Load Removable media just pass the drive letter to the sub
    Public Sub LoadRemovable(ByVal EjectDrive As String)
        Dim hDrive, DummyReturnedBytes As Integer
        Dim DriveLetterAndColon As String

        DriveLetterAndColon = UCase(Left(EjectDrive & ":", 2)) 'Make it all caps for easy interpretation
        hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
        If hDrive <> INVALID_HANDLE_VALUE Then
            'Eject media!
            Call DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, 0, 0, 0, 0, DummyReturnedBytes, 0)
            Call CloseHandle(hDrive) 'Clean up after ourselves
        End If
    End Sub

End Module

ومثال عن الاستخدام

EjectRemovable("h:\")

LoadRemovable("h:\")

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

هناك حل أسهل بإستخدام دالة واحد وهي mciSendString

يمكنك الاطلاع عليه هنا، الكود كتبته سابقا بالسي شارب، لكن تحويله لفيجوال بيسيك سهل لانه استدعاء لل API

http://www.experts-exchange.com/Programmin...Q_20538337.html

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#4

أخ محمد نسمان بعرف الكود يللي بتقصده باستخدام mciSendString بس باستخدام هالكود ما قدرت افتح غير سواقة واحدة وهون عم بقدر افتح أي سواقة بدي اياها

وعلى فكرة أنا مساويه عالـ VC++ من زمان وموجود بأحد أعداد مجلة PC القديمة باسمي

رابط الموضوع الذي وضعته موجود في موقع يطلب اشتراك غير مجاني

يرجى ارفاق الكود هنا إذا كنت ترغب في المناقشة

الكود الذي وضعته أنا ليس صعبا أو كبيرا كما أن استخدامه سهل ولكنه مرن أكثر من الكود الذي تقصده حيث يمكن استخدامه لأي قرص قابل للنزع وليس للأقراص المدمجة CD's فقط بينما الكود الذي تقصده محصور للأقراص المدمجة Cd's و للقرص الأول فقط أي في حال وجود سواقتين مثلا لايفيدك إلا للسواقة الأولى فقط

تم تعديل هذه المشاركة بواسطة samerselo في 10 أغسطس 2005 في 16:43

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

تتمة لجوابي حول أمر mciSendString

ولمن يحب الاطلاع الكود موجود في مجلة PC Magazine الطبعة العربية

عدد تشرين الثاني عام 1999 الصفحة 150

وهذا هو كود الإغلاق بلغة فيجول سي بلس بلس

#include "stdafx.h"
#include "mmsystem.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MCI_OPEN_PARMS  mcio;

	mcio.lpstrDeviceType = (char*)MCI_DEVTYPE_CD_AUDIO;

	if (mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
  MCI_OPEN_SHAREABLE,(DWORD) (LPMCI_OPEN_PARMS) &mcio) == 0)
	{
  mciSendCommand(mcio.wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
  mciSendCommand(mcio.wDeviceID, MCI_CLOSE, MCI_WAIT,0);
	}

	return 0;
}

وهذا كود الفتح بلغة فيجول سي بلس بلس

#include "stdafx.h"
#include "mmsystem.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MCI_OPEN_PARMS  mcio;

	mcio.lpstrDeviceType = (char*)MCI_DEVTYPE_CD_AUDIO;

	if (mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
  MCI_OPEN_SHAREABLE,(DWORD) (LPMCI_OPEN_PARMS) &mcio) == 0)
	{
  mciSendCommand(mcio.wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
  mciSendCommand(mcio.wDeviceID, MCI_CLOSE, MCI_WAIT,0);
	}

	return 0;
}

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

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

أخي محمد

اقتباس
أخ محمد نسمان بعرف الكود يللي بتقصده باستخدام mciSendString بس باستخدام هالكود ما قدرت افتح غير سواقة واحدة وهون عم بقدر افتح أي سواقة بدي اياها

يمكن ذلك من خلال mciSendString ايضا، وهذا المثال مع التعديل وقمت بتحويله الى فيجوال بيسيك دوت نت

       <DllImport("winmm", EntryPoint:="mciSendStringA")> _
    Private Shared Sub mciSendString(ByVal lpszCommand As String, _
    ByVal lpszReturnString As String, ByVal cchReturnLength As Integer, ByVal hwndCallback As Integer)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        mciSendString("open cdaudio!G: alias MyDrive", "", 0, 0)
        mciSendString("Set MyDrive door open wait", "", 0, 0)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        mciSendString("Set MyDrive door closed wait", "", 0, 0)
    End Sub

G: هو محرك السي روم في جهازي، ولا يوجد الا هو لكن يمكنك تغيره الى اي حرف اخر وسوف يعمل ايضا

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#7

أخ محمد نسمان

شكرا لك على المناقشة والتوضيح

على كل حال بجرب الكود وبرد عليك بعدين

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#8

اخ محمد نسمان

طريقتك باستخدام MciSeendString اشتغلت ولكن بعد تعديلات طفيفة عليها

وهذا الكود الذي استخدمته وفقا لطريقتك

Module EjectLoadUsingMCI

    <DllImport("winmm", EntryPoint:="mciSendStringA")> _
 Private Sub mciSendString(ByVal lpszCommand As String, _
 ByVal lpszReturnString As String, ByVal cchReturnLength As Integer, ByVal hwndCallback As Integer)

    End Sub

    Public Sub OpenCDDoor(ByVal Drive As String)
        mciSendString("open cdaudio!" & Drive, "", 0, 0)
        mciSendString("Set " & Drive & " door open wait", "", 0, 0)
    End Sub

    Public Sub CloseCDDoor(ByVal drive As String)
        mciSendString("open cdaudio!" & drive, "", 0, 0)
        mciSendString("Set " & drive & " door closed wait", "", 0, 0)
    End Sub

End Module

بس عندي ملاحظات

أولا - الطريقة ناجحة للأقراص من نوع CD-Rom وفاشلة بالنسبة للأقراص من النوع Removable بينما طريقتي الأولى ناجحة لكلا النوعين

ثانيا - عندما أستخدم طريقة MciSendString لايعود بإمكاني برمجيا فتح أو إغلاق الباب إلا بواسطة هذه الطريقة

على كل حال شكرا لك

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#9

و حرصا على أن تعم الفائدة للجميع

ضمن المرفقات يوجد الملفات المصدرية لبرنامج يضم كلا الطريقتين

وبهذا يستطيع كل منا استخدام الطريقة التي تعجبه وتناسب برنامجه

يرجى إبداء الرأي والمشاركة في النقاش من باقي أعضاء المنتدى

WindowsApplication4.zip

تم تعديل هذه المشاركة بواسطة samerselo في 11 أغسطس 2005 في 22:00

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة