Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0500: Virtuelle Laufwerke erstellen

 von 

Beschreibung 

Dieser Tipp zeigt wie man virtuelle Laufwerke erstellt, die dann auf einen Ordner verweisen. Dies wird mit dem Programm "subst" realisiert.

Ergänzung am 13.11.2002:
Jetzt können auch Windowsordner, die ein Leerzeichen oder ähnliches enthalten, verwendet werden!

Ergäntung 27.12.2002:
Nun funktioniert der Tipp auch fehlerfrei, wenn es sich nicht um Laufwerk C handelt

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetShortPathNameA (GetShortPathName), Sleep

Download:

Download des Beispielprojektes [2,92 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'--------------- Anfang Projektdatei subs.vbp ---------------
'---------- Anfang Formular "Form1" alias subs.frm ----------
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Festplattenauswahlliste "Drive1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Verzeichnisauswahlliste "Dir1"
' Steuerelement: Listen-Steuerelement "List2"
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

'Hinweis:
'Unter WindowsNT und den daruaf aufbauenden Betriebssystemen gibt es auch eine
'API-Funktion, die genau das erledigen soll
'
'Private Declare Function DefineDosDevice Lib "kernel32.dll" Alias _
'       "DefineDosDeviceA" (ByVal dwFlags As Long, _
'       ByVal lpDeviceName As String, _
'       Optional ByVal lpTargetPath As String = vbNullString) As Long
'
'Private Const DDD_CREATE_DEFINITION As Long = &H0   ' LW-Zuordnung
'Private Const DDD_REMOVE_DEFINITION As Long = &H2   ' LW-Zuordnung wieder aufheben

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliSeconds As Long)

'Ergänzung am 13.11.2002 zum Verwenden von Ordnern, die ein Space im Namen haben etc.
Private Declare Function GetShortPathName Lib "kernel32" _
    Alias "GetShortPathNameA" ( _
    ByVal lpszLongPath As String, _
    ByVal lpszShortPath As String, _
    ByVal cchBuffer As Long) As Long
        
Dim strShell, strPath, sbstfn(25) As String
Dim sbstf, l1, l2 As Long

Private Sub Command1_Click()
    'Virtl. Laufwerk erstellen
    
    'Ergänzung am 13.11.2002
    Dim strDosPath As String
    Dim Result As Long
    
    strDosPath = Space(255)
    Result = GetShortPathName(strPath, strDosPath, Len(strDosPath))
    strDosPath = Mid$(strDosPath, 1, Result)
    
    strShell = "subst " & List1.List(l1) & " " & strDosPath
    'Ergänzung ende
    
    List2.AddItem List1.List(l1)
    List1.RemoveItem (l1)
    sbstf = sbstf + 1
    sbstfn(sbstf) = strPath
    Shell strShell
    Command2.Enabled = True
End Sub

Private Sub Command2_Click()
    'Virtl. Laufwerk löschen
    
    Dim i As Long
    
    If sbstf > -1 Then
        strShell = "subst " & List2.List(l2) & " /D"
        List1.AddItem List2.List(l2)
        List2.RemoveItem (l2)
        Shell strShell
        For i = l2 + 1 To sbstf
            sbstfn(i - 1) = sbstfn(i)
        Next i
        sbstf = sbstf - 1
    End If
    If sbstf = -1 Then Command2.Enabled = False
End Sub

Private Sub Dir1_Change()
    strPath = Dir1.Path
End Sub

Private Sub Drive1_Change()
    Dir1.Path = Drive1.Drive
End Sub

Private Sub Form_Load()
    Dim i As Long
    Dim ff As Long
    
    ff = FreeFile
    Command2.Enabled = False
    sbstf = -1
    strShell = App.Path & "\subs.bat"
    
    
    Open strShell For Output As #ff
       Print #ff, "subst > subst.txt"
    Close #ff
    Sleep (100)
    Shell strShell
    Sleep (100)
    
    Form1.Show
    If Len(Dir(CurDir$ & "\subst.txt")) > 0 Then
        Open CurDir$ & "\subst.txt" For Input As #ff
            While Not EOF(ff)
                Line Input #ff, strShell
                List2.AddItem (Left$(strShell, 2))
                sbstf = sbstf + 1
                sbstfn(sbstf) = Right$(strShell, Len(strShell) - 6)
            Wend
            Command2.Enabled = True
        Close #ff
        Sleep 100
        Kill (CurDir$ & "\subst.txt")
    End If
    For i = 65 To 90
            List1.AddItem Chr$(i) & ":"
    Next i
    Call Dir1_Change
End Sub

Private Sub List1_Click()
    If List1.ListIndex <> -1 Then
        l1 = List1.ListIndex
    End If
End Sub

Private Sub List2_Click()
    If List2.ListIndex <> -1 Then
        l2 = List2.ListIndex
        Dir1.Path = sbstfn(l2)
    End If
End Sub
'----------- Ende Formular "Form1" alias subs.frm -----------
'---------------- Ende Projektdatei subs.vbp ----------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 12 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Mishka am 12.07.2008 um 21:24

Hallo,
kann man dem neu-erstellten virtuellen Datenträger auch einen Namen geben ?

Danke,
Mishka

Kommentar von MD am 20.11.2006 um 17:04

Dieses Thema ist zwar schon etwas älter, aber vielleicht findet sich doch noch jemand, der folgendes realisieren kann...

Unter XP (XP Pro SP2) sollte ein virtuelles LW mit der subst.exe angelegt werden... bis hierhin ist es wohl kein Problem...
ABER ich möchte danach dem "neuen Virtuelle LW", meinetwegen auch dem Link umbenennen können.

Wenn Xp es als LW erkennt, sollte es möglich sein, dieses auch umzubenennen.
Wenn es als Link (e.g. Shortcut) erkannt wird, sollte dies also auch möglich sein.

Das wäre doch eine Herausforderung, oder...?

gruss
MD

Kommentar von Agent J am 20.02.2006 um 13:55

@Kevin

mit diesem Code kannst du Virtuelle Laufwerke hinzufügen und Löschen.


'Mountet einen Pfad auf einen LW Buchstaben
Sub MountVirtualDrive(strVirtualDrive, strPhysicPath)
Shell "subst.exe " & strVirtualDrive & Chr(32) & strPhysicPath, vbHide
End Sub

'UnMountet einen Pfad von einem LW Buchstaben
Sub UnMountVirtualDrive(strVirtualDrive)
Shell "subst.exe " & strVirtualDrive & " /d", vbHide
End Sub

Kommentar von Kevin am 24.01.2006 um 20:45

Danke ich habe jetzt eine Virtuelle Festplatte und kann sie nicht Löschne !!!!!!!!!!!!!!!!!!!!

Kommentar von Daniel am 12.10.2003 um 19:09

wozu soll ich eine label1 und label2 in meine form machen?! die sind im code gar nicht erwähnt. also brauch ich die auch nicht in der controls-liste...

Kommentar von Mgalpha am 20.06.2003 um 02:44

also jetzt geb ich hier mal was zum besten !

dieses Programm steuert lediglich ein Dos Tool namens

subst !

subst erstellt virtuelle laufwerke !

aber keine cdroms !

daher kann auch ein Programm das ein CD-Rom oder DVD-Rom
benötigt !

dieses Laufwerk nicht erkennen !

Ps.:
Es nutzt ncihts den Sorce zu endern !

ihr müßtet schon die Datei Subst.exe ändern !

besser ist es sich einfach ein Programm zubeschaffen das es zuläst ein Lauferkstyp frei zuwählen und mit einem Verzeichnis zu verknüpfen !

mfg mg !

Kommentar von Marc am 16.03.2003 um 10:36

DIESE LAUFWERKE SIND JA AUCH KEINE VIRTUELLEN CD-LAUFWERKE, SONDERN NUR EIN LINK AUF EIN VERZEICHNIS.UND DAS WEIß WINDOWS AUCH (DAS DAS NUR EIN LINK IST).SEHEN KANN MAN DAS AUCH, WEIL DAS EIN GANZ ANDERES SYMBOL IST.

Kommentar von Arne Hinrichs am 23.02.2003 um 16:05

Um den Vorschlag umzusetzen bin ich viel zu sehr Amateurliga. Ich habe aber ein Problem, vielleicht könnt Ihr mir helfen? Ich habe auf meinem PC (mit Windows ME) vier Laufwerke vermutlich aus alten zeiten mit irgendeinem Programm zur Einrichtung Viruteller Laufwerke. Die Beeichnung im Windows Systemmanager: V386 STEALTH DVD. Neue Programme wie DEAMON oder VIRTUAL CD V 4.5 erkennen diese virtuellen laufwerke nicht als die ihren und können sie auch nicht bearbeiten. Mit Windows-System (Gerätemanager) krieg ich die Dinger ums Verrecken jedoch auch nicht raus. Ich kann zwar die Laufwerke mit ENTFERNEN jeweils angeblich aus der Systemkonfiguration herauslöschen, aber real tut sich nichts. Sie sind da, bleiben da und lassen sich nicht mal umbenennen. Also bitte, bitte helft mir; ich bin mit meinem Latein am Ende.

Kommentar von Frank"A"delik am 22.12.2002 um 17:24

bei mir gab es Probleme in der Zeile:

sbstfn(sbstf) = Right$(strShell, Len(strShell) - 8)

so bald ich nicht mehr Laufwerk C benutzte... Ändert die 8 auf 6 und es geht. System: Windows ME

Kommentar von Jonathan am 05.12.2002 um 18:47

Wo ist das Problem?
Kopiere die CD auf die Festplatte in ein Bestimmtes Verzeichnis und erstele aus dem Verzeichnis mit obrigem Tipp ein Virtuelles LW

Kommentar von Jonny am 19.11.2002 um 13:05

Wie ist es möglich den Inhalt einer CD auf die Festplatte zu bekommen und daraus ein Virtuelles Laufwerk zu machen (Wie VirutalCD) ?

Kommentar von CHRTEK Network CNT am 10.11.2002 um 14:25

Eine Frage, gibt es auch eine Möglichkeit Subst in einer Windows Version zu nutzen, z.B. per API Aufruf, oder externer dll´s?