Beliebiges CD Laufwerk öffnen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von DiePod.

    Beliebiges CD Laufwerk öffnen

    Hallo Community!
    Hab vor kurzem diesen Code gefunden
    vbarchiv.net/tipps/tipp_239-be…ffnen-und-schliessen.html

    Funktioniert aber leider nicht in VB.Net. Kennt jemand eine Lösung für vb.net ein beliebiges CD Laufwerk zu öffnen, also nach Laufwerksbuchstaben?

    Danke!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DiePod“ ()

    DiePod schrieb:

    ein beliebiges CD Laufwerk zu öffnen, also nach Laufwerksbuchstaben?
    Also doch ein bestimmtes. :D
    Du wirst Dich schon ein wenig mit API befassen müssen, das ist aber eigentlich ganz einfach.
    @SystemUnknow hat Dir pinvoke.net gesagt, dort trägst Du die betreffende Routine ein, klickst auf den Pfeil und bekommst die .NET-Deklaration für C# und VB angezeigt.
    Diese kopierst Du in Deine Klasse und kannst sie benutzen.
    Wenn Du nicht weißt wie, frag das Forum. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    OK danke erstmal

    RodFromGermany schrieb:

    @SystemUnknow hat Dir pinvoke.net gesagt, dort trägst Du die betreffende Routine ein, klickst auf den Pfeil und bekommst die .NET-Deklaration für C# und VB angezeigt.
    und wie finde ich die passende Routine für mein Problem? Sorry, aber ich kenn mich damit wirklich nicht gut aus ;)
    Naja eigentlich solltest du auf Pinvoke fündig werden, aber da ich mir mal eine CD-Ripper-Klasse erstellt habe (und daher weiß, dass solche Suchen nervig sein können), kann ich dir die passenden Funktionen ja mal rauskopieren:

    VB.NET-Quellcode

    1. <DllImport("Kernel32.dll", SetLastError:=True)>
    2. Public Shared Function CreateFile(ByVal FileName As String, ByVal DesiredAccess As UInteger, ByVal ShareMode As UInteger, ByVal lpSecurityAttributes As IntPtr, ByVal CreationDisposition As UInteger, ByVal dwFlagsAndAttributes As UInteger, ByVal hTemplateFile As IntPtr) As IntPtr
    3. End Function
    4. <DllImport("Kernel32.dll", SetLastError:=True)>
    5. Public Shared Function DeviceIoControl(ByVal hDevice As IntPtr, ByVal IoControlCode As UInteger, <[In]()> ByVal rri As RAW_READ_INFO, ByVal InBufferSize As UInteger, <[In](), Out()> ByVal OutBuffer As Byte(), ByVal OutBufferSize As UInteger, ByRef BytesReturned As UInteger, ByVal Overlapped As IntPtr) As Integer
    6. End Function
    7. <DllImport("Kernel32.dll", SetLastError:=True)>
    8. Public Shared Function DeviceIoControl(ByVal hDevice As IntPtr, ByVal IoControlCode As UInteger, ByVal InBuffer As IntPtr, ByVal InBufferSize As UInteger, <Out()> ByVal OutTOC As CDROM_TOC, ByVal OutBufferSize As UInteger, ByRef BytesReturned As UInteger, ByVal Overlapped As IntPtr) As Integer
    9. End Function
    10. <DllImport("Kernel32.dll", SetLastError:=True)>
    11. Public Shared Function DeviceIoControl(ByVal hDevice As IntPtr, ByVal IoControlCode As UInteger, ByVal lpInBuffer As IntPtr, ByVal InBufferSize As UInteger, ByVal lpOutBuffer As IntPtr, ByVal nOutBufferSize As UInteger, ByRef lpBytesReturned As UInteger, ByVal lpOverlapped As IntPtr) As Integer
    12. End Function
    13. <DllImport("Kernel32.dll", SetLastError:=True)>
    14. Public Shared Function DeviceIoControl(ByVal hDevice As IntPtr, ByVal IoControlCode As UInteger, <[In]()> ByVal InMediaRemoval As PREVENT_MEDIA_REMOVAL, ByVal InBufferSize As UInteger, ByVal OutBuffer As IntPtr, ByVal OutBufferSize As UInteger, ByRef BytesReturned As UInteger, ByVal Overlapped As IntPtr) As Integer
    15. End Function

    (du musst mal schauen, welche der Überladungen benötigt wird und die verwendeten Konstanten sollten auch auf Pinvoke stehen)

    Die kannst du dann so verwenden:

    VB.NET-Quellcode

    1. Dim cdHandle As IntPtr = CreateFile("\\.\" & Laufwerksbuchstabe, Kernel32.GENERIC_READ, Kernel32.FILE_SHARE_READ Or Kernel32.FILE_SHARE_WRITE, IntPtr.Zero, Kernel32.OPEN_EXISTING, 0, IntPtr.Zero)
    2. 'Schließen
    3. DeviceIoControl(cdHandle, IOCTL_STORAGE_LOAD_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, 0, IntPtr.Zero)
    4. 'Öffnen
    5. DeviceIoControl(cdHandle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, 0, IntPtr.Zero)
    Also bei mir läuft folgendes problemlos:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. <DllImport("Winmm.dll")> Private Shared Function mciExecute(ByVal pszCommand As String) As Boolean
    5. End Function
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. MciExecute("Set CDaudio door open")
    8. End Sub
    9. End Class


    Edit: Ah fuck, Du möchtest nach Laufwerkbuchstaben. Sorry.

    DiePod schrieb:

    Leider hab ich nach einer Stunde immer noch nicht rausbekommen wie man Ihn anwendet. Wenn ich Ihn einfüge unterstreicht er u.a. kann mir bitte jemand erklären wie ich dies verwende?

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices


    Den Fehler hättest Du auch selbst beheben könne, in dem Du einen Klick auf das Unterstrichene machst,
    da wird dir der Fehler ausgegeben.
    Da du eine relativ spezifische Frage gestellt hattest, bin ich eigentlich davon ausgegangen, dass du dich besser auskennst.
    Bei Interesse ließ dir diese Artikel durch:
    msdn.microsoft.com/de-de/library/aa446536.aspx
    msdn.microsoft.com/de-de/library/sd10k43k.aspx

    (wobei ich vom "Declare"-Schlüsselwort abraten würde)
    API Funktion GetDriverType kannst dir sparen, laufwerksbuchstaben und laufwerktyp kannst mit Hilfe NET Klassen ermitteln.
    Du muß nur API Funktion mciSendString aufrufen, das ist der Code um CD Laufewerk zu schliesen bzw öffnen:

    VB.NET-Quellcode

    1. ' CD-Laufwrek öffnen
    2. mciSendString "Open " & CDDrive & _
    3. " Type cdaudio Alias cd", Buffer, 255, 0
    4. mciSendString "set cd door open", 0&, 0, 0
    5. mciSendString "close cd", 0&, 0, 0
    6. ' keine Laufwerksangabe -> Standard CDROM-Laufwerk
    7. ' öffnen
    8. Else
    9. mciSendString "set cdaudio door open", 0&, 0, 0
    10. End If


    Der rest dürfte nicht schwer sein...hast genügend tipps bekommen...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SystemUnknow“ ()

    Das Ergebnis für die Nachwelt und für die die sowas über Google suchen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Declare Function mciSendString Lib "winmm.dll" Alias _
    2. "mciSendStringA" (ByVal lpstrCommand As String, ByVal _
    3. lpstrReturnString As String, ByVal uReturnLength As _
    4. Long, ByVal hwndCallback As Long) As Long
    5. Private Sub Btn_Open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Open.Click
    6. Dim DriveLetter As String = TextBox1.Text
    7. Dim AliasName As String
    8. AliasName = "Laufwerk" & DriveLetter
    9. mciSendString("Open " & DriveLetter & ": Alias " & AliasName _
    10. & " Type CDAudio", CStr(0), 0, 0)
    11. mciSendString("Set " & AliasName & " Door Open", CStr(0), 0, 0)
    12. End Sub
    13. Private Sub Btn_Close_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Close.Click
    14. Dim DriveLetter As String = TextBox1.Text
    15. Dim AliasName As String
    16. AliasName = "Laufwerk" & DriveLetter
    17. mciSendString("Open " & DriveLetter & ": Alias " & AliasName _
    18. & " Type CDAudio", CStr(0), 0, 0)
    19. mciSendString("Set " & AliasName & " Door Closed", CStr(0), 0, 0)
    20. End Sub


    Edit / das ganze noch etwas schöner
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Declare Function mciSendString Lib "winmm.dll" Alias _
    2. "mciSendStringA" (ByVal lpstrCommand As String, ByVal _
    3. lpstrReturnString As String, ByVal uReturnLength As _
    4. Long, ByVal hwndCallback As Long) As Long
    5. Private Sub Btn_Open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Open.Click
    6. Open_Tray(TextBox1.Text.Trim, True)
    7. End Sub
    8. Private Sub Btn_Close_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Close.Click
    9. Open_Tray(TextBox1.Text.Trim, False)
    10. End Sub
    11. Private Sub Open_Tray(ByVal Letter As String, ByVal Open As Boolean)
    12. Dim Drive As String = Letter.Substring(0, 1)
    13. Dim Action As String = String.Empty
    14. Select Case Open
    15. Case True
    16. Action = " Door Open"
    17. Case False
    18. Action = " Door Closed"
    19. Case Else
    20. Exit Sub
    21. End Select
    22. mciSendString(String.Concat("Open ", Drive, ": Alias ", "Laufwerk", Drive, " Type CDAudio"), String.Empty, 0, 0)
    23. mciSendString(String.Concat("Set ", "Laufwerk", Drive, Action), String.Empty, 0, 0)
    24. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bernd“ ()