Eli onko DriveListBoxilla mahdollista saada vain käytettävissä olevat CD ja DVD asemat näkyviin, niin että kovalevy ja floppy ei näy "valikossa" ?
Vielä kiva yksityiskohta olisi jos saisi CD/DVD asemien malli - ym. tiedot näkyviin...
Esim.
D:HL-DT-DVDRAM GSA-4167B ATA DEVICE. E:NO4067W BKB433Y SCSI CdRom DEVICE.
eikä näin tylsästi kuten:
D: E:
KIITOS JO ETUKÄTEEN....!
Heippa Happy!
tässä sulle purkkaviritelmä...
Private Sub Form_Load() 'formille ComboBoxi & DirList kontrollit 'combolle nimeksi: DriveListBox1 'referenssi Microsoft Scripting Runtime Dim fso Set fso = New Scripting.FileSystemObject Dim drv As Scripting.Drive For Each drv In fso.Drives With drv If .DriveType = CDRom Then If .IsReady Then DriveListBox1.AddItem .Path & _ " Tyyppi: CD/DVD " & " Nimi: " & _ .VolumeName & " Sarjanumero: " & _ CStr(.SerialNumber) Else DriveListBox1.AddItem .Path & _ " Tyyppi: CD/DVD " & " Ei valmiina" End If End If End With Next drv Set fso = Nothing If DriveListBox1.ListCount > 0 Then DriveListBox1.ListIndex = 0 End If End Sub Private Sub DriveListBox1_Click() If InStr(DriveListBox1.Text, "Ei valmiina") > 0 Then Dir1.Enabled = False: Dir1.Visible = False: Beep Else Dir1.Enabled = True: Dir1.Visible = True Dir1.Path = Left(DriveListBox1.Text, 2) End If End Sub
KIITOS Nea !!!!!!!
Tulin just töistä ja olihan tätä vielä pakko kokeilla..... TOIMII :) !
Mutta saako noi CD/DVD aseman tiedot haettua esim. Järjestelmätiedoista?
Eli että se näyttäis CD/DVD aseman mallin, tyypin... (what ever), eikä asemassa olevan levyn tietoja.
Jos mahdollista... pystyykö jollain tunnistamaan tavallisen ja tallentavan aseman...?
(Noin ohimennen kysyisin, jos yrittäs joskus tehdä poltto ohjelmaa..)
Mutta näillä päästiin taas eteenpäin.
Kiitos vielä kerran -Nea- !
Heippa taas Happy!
tässä sulle lisää purkkaviritelmää...
'formille ComboBoxi & DirList kontrollit 'combolle nimeksi: DriveListBox1 Option Explicit Private Sub Form_Load() wmiInfo End Sub Private Sub wmiInfo() Dim CDRomAsemat As SWbemObjectSet Dim cdasema As SWbemObject ReDim tiedot(0 To 7, 0) As String Dim i As Integer, j As Integer Dim hlpStr As String, k As Integer 'referenssi: Microsoft WMI Scripting V1.2 Library '(C:\WINDOWS\system32\wbem\wbemdisp.TLB) Set CDRomAsemat = GetObject _ ("winmgmts:{impersonationLevel=impersonate}") _ .InstancesOf("Win32_CDRomDrive") For Each cdasema In CDRomAsemat With cdasema ReDim Preserve tiedot(0 To 7, i) tiedot(0, i) = .Drive tiedot(2, i) = .Description tiedot(1, i) = .Name tiedot(3, i) = .DeviceID tiedot(4, i) = .Manufacturer tiedot(5, i) = .MediaLoaded tiedot(6, i) = .Status tiedot(7, i) = FormatNumber(.Size, 0) End With For i = 0 To UBound(tiedot, 1) For j = 0 To UBound(tiedot, 2) Select Case i Case 0 To 2 If Len(tiedot(i, j)) > 0 Then hlpStr = hlpStr & tiedot(i, j) Else hlpStr = hlpStr & " - " End If Case 3 If Len(tiedot(i, j)) > 0 Then If InStr(tiedot(i, j), "\") > 0 Then hlpStr = hlpStr & _ Left(tiedot(i, j), InStr(tiedot(i, j), "\") - 1) _ & " " Else hlpStr = hlpStr & " - " End If End If Case 4 To 6 If Len(tiedot(i, j)) > 0 Then hlpStr = hlpStr & tiedot(i, j) Else hlpStr = hlpStr & " - " End If Case 7 If Val(tiedot(i, j)) > 0 Then hlpStr = hlpStr & _ Format$(CLng(tiedot(i, j)) / 1048576, "0.00") & " MB" Else hlpStr = hlpStr & " - " End If End Select If i <> 3 Then hlpStr = hlpStr & " | " 'Mgbox tiedot(i, j) 'MsgBox hlpStr Next j Next i i = i + 1 DriveListBox1.AddItem hlpStr: hlpStr = "" Next Set levyasemat = Nothing If DriveListBox1.ListCount > 0 Then DriveListBox1.ListIndex = 0 End If End Sub Private Sub DriveListBox1_Click() Select Case InStr(DriveListBox1.Text, "False") Case > 0 Dir1.Enabled = False: Dir1.Visible = False: Beep Case Else If Mid(DriveListBox1.Text, 2, 1) = ":" Then Dir1.Enabled = True: Dir1.Visible = True Dir1.Path = Left(DriveListBox1.Text, 2) End If End Select End Sub
-Nea-
Heippa taas Happy!
pikku purkkakoodi lisäys vielä liittyen kysymykseesi: pystyykö jollain tunnistamaan tavallisen ja tallentavan aseman...?
Case 7 If Val(tiedot(i, j)) > 0 Then hlpStr = hlpStr & _ Format$(CLng(tiedot(i, j)) / 1048576, "0.00") & " MB" Else hlpStr = hlpStr & " - " End If ' lisää tänne ---------------------------------------------------- 'Koska osa laite/ajurivalmistajista ilmoittaa laitteen 'R[l]W[/l]-ominaisuuksista suoraan Description-stringissä 'ja jättävät siten usein ilmoituksen pois Capabilities- 'taulukosta niin on aluksi tutkittava sisältyykö tieto jo 'tässä vaiheessa apu-stringiin (hlpStr) ja jos ei löydy niin...*** If InStr(hlpStr, "RW") = 0 And InStr(hlpStr, "R/W") = 0 Then ' tutkitaan löytyykö tieto Capabilities taulukosta ' nyt on sitten niin että valmistajien tyylit ilmoitella ' ominaisuuksista ko. taulukossa venyvät kuin kuminauha ' (tiedot pukataan/jätetään pukkaamatta taulukkoon)... For k = 0 To UBound(asema.capabilities) 'elikä taulukon alkioita voi olla enempi tai vähempi, 'mutta jos jokin alkio palauttaa arvon: 4 niin laitteen 'pitäisi olla myös writeable elikä 'kirjoittava'. 'tutkitaan taulukkoa silmukassa... If asema.capabilities(i) = 4 Then 'mikäli tieto löytyy niin sijoitetaan tieto 'apu-stringiin ja hypätään pois silmukastata hlpStr = hlpStr & " | RW ": Exit For End If Next k 'jos tietoa ei löytynyt taulukostakaan niin sijoitetaan 'sitten tämä 'ReadOnly' tieto apustringiin... If InStr(hlpStr, "RW") = 0 Then hlpStr = hlpStr & " | RO " End If Else '*** mutta jos tieto löytyi jo alussa niin varmuuden 'vuoksi sijoitetaan tieto vielä 'omaan' paikkaansa... hlpStr = hlpStr & " | RW " End If 'väliin jäänyt pätkä ---------------------------------------------- End Select
Bugi-Päivitys: eli siis levyasemat piti vaihtaa jokapaikassa -> CDRomAsemat
ja vastaavasti asema -> cdasema...
Moi Nea.
Tuohon koodiin oli kai tullu joku virhe?
If InStr(hlpStr, "RW") = 0 And InStr(hlpStr, "R/W") = 0 Then For k = 0 To UBound(cdasema.capabilities) If cdasema.capabilities(i) = 4 Then end if
Eli vaihdoin ton cdasema.capabilities(i) -> cdasema.capabilities(k)
Ilmoitti muuten että Run time error'2147352565(8002000b)
Nyt toimii :)
Vielä yksi juttu sekaa pakkaa. Virtuaali asemat.
Toi koodi kyllä löytää ne, mutta se ei suostu lukemaan "levyn" sisältöä.
Onnistuisiko virtuaali asemien sisällön lukeminen tai vieläparempi vaihtoehto olisi jos ne saisi kokonaan pois käytöstä ohjelman ajon ajaksi ja taas sitten käyttöön kun ohjelma lopetetaan.
Kiitti Nea.
Heippa taas Happy!
siis ekaa lukuunottamatta noi edelliset viritykset on täysin syvältä...unohda ne!
Option Explicit Private Sub Form_Load() wmiInfo End Sub Private Sub wmiInfo() Dim CDRomAsemat As SWbemObjectSet Dim cdasema As SWbemObject ReDim tiedot(0 To 7, 0) As String Dim i As Integer, j As Integer Dim k As Integer, l As Integer Dim hlpStr As String Set CDRomAsemat = GetObject _ ("winmgmts:{impersonationLevel=impersonate}") _ .InstancesOf("Win32_CDROMDrive") For Each cdasema In CDRomAsemat With cdasema ReDim Preserve tiedot(0 To 7, i) tiedot(0, i) = .Drive tiedot(2, i) = .Description tiedot(1, i) = .Name tiedot(3, i) = .DeviceID tiedot(4, i) = .Manufacturer tiedot(5, i) = .MediaLoaded tiedot(6, i) = .Status tiedot(7, i) = FormatNumber(.Size, 0) End With For j = 0 To UBound(tiedot, 1) Select Case j Case 0 To 2 If Len(tiedot(j, i)) > 0 Then hlpStr = hlpStr & tiedot(j, i) Else hlpStr = hlpStr & " - " End If Case 3 If Len(tiedot(j, i)) > 0 Then If InStr(tiedot(j, i), "\") > 0 Then hlpStr = hlpStr & _ Left(tiedot(j, i), InStr(tiedot(j, i), "\") - 1) _ & " " Else End If End If Case 4 To 6 If Len(tiedot(j, i)) > 0 Then hlpStr = hlpStr & tiedot(j, i) Else hlpStr = hlpStr & " - " End If Case 7 If Val(tiedot(j, i)) > 0 Then hlpStr = hlpStr & _ Format$(CLng(tiedot(j, i)) / 1048576, "0.00") & " MB" Else hlpStr = hlpStr & " - " End If 'poista nää kaks riviä, ja hipsu pois kaikista muista 'niin virtuaali-jutskat ei oo mukana tässä kuviossa... Dim rw As Boolean ', wrl As Boolean rw = False ': wrl = False For k = 1 To Len(hlpStr) If UCase(Mid(hlpStr, k, 2)) = "RW" Or _ UCase(Mid(hlpStr, k, 3)) = "R/W" Or _ UCase(Mid(hlpStr, k, 5)) = "IMAGE" Or _ UCase(Mid(hlpStr, k, 7)) = "VIRTUAL" Then 'If UCase(Mid(hlpStr, k, 5)) = "IMAGE" Or _ 'UCase(Mid(hlpStr, k, 7)) = "VIRTUAL" Then 'wrl = True 'End If rw = True: Exit For End If Next k If Not rw Then For l = 0 To UBound(cdasema.capabilities) If cdasema.capabilities(k) = 4 Then hlpStr = hlpStr & " | " & " RW ": Exit For End If Next l If InStr(hlpStr, "RW") = 0 Then hlpStr = hlpStr & " | " & " RO " End If Else hlpStr = hlpStr & " | " & " RW " End If End Select If j <> 3 And j <> 7 Then _ hlpStr = hlpStr & " | " Next j i = i + 1 'If Not wrl Then DriveListBox1.AddItem hlpStr 'End If hlpStr = "" Next Erase tiedot Set CDRomAsemat = Nothing If DriveListBox1.ListCount > 0 Then DriveListBox1.ListIndex = 0 End If End Sub Private Sub DriveListBox1_Click() Select Case InStr(DriveListBox1.Text, "False") Case Is > 0 Dir1.Enabled = False: Dir1.Visible = False: Beep Case Else If Mid(DriveListBox1.Text, 2, 1) = ":" Then Dir1.Enabled = True: Dir1.Visible = True Dir1.Path = Left(DriveListBox1.Text, 2) End If End Select End Sub
-Nea-
Moi taas Nea!
Joo sain toimimaan pikku hinkkauksen jälkeen, MUTTA.....
Kun asemaan laittaa DVD-Levyn, antaa virheen Overflow.
Debuggasin koodia ..
hlpStr = hlpStr & _ Format$(CLng(tiedot(j, i)) / 1048576, "0.00") & " MB"
toi "tiedot(j, i)" näyttää just niinku pitääkin, mutta jostain syystä se ei vissii "osaa" laskea...
Mitäs nyt tehdää ???
Onko joku muukin juttu DVD-asemille kuin toi "Win32_CDROMDrive" ?
----------------------------------------------------------------------
No nyt sain sen toimimaa...
muutin tuota koodia hiukan.
hlpStr = hlpStr & _ Format$(CLng(tiedot(j, i)) / 1048576, "0.00") & " MB"
Otin ton CLng jutun pois eli ->
hlpStr = hlpStr & _ Format$(tiedot(j, i) / 1048576, "0.00") & " MB"
Saapi nähdä tuleeko vielä jotain ongelmii ;)
Heippa taas Happy!
Virhe johtui sulkuvirheestä (sori se k - l:ien välissä)...DVD-asemasta saat todennäköisesti Giga-tavuja, joten tässä vähän lisäviilattavaa
If tiedot(j, i) < 1073741824 Then hlpStr = hlpStr & _ Format$(CLng(tiedot(j, i) / 1048576), "0.00") & " MB" Else hlpStr = hlpStr & _ Format$(CLng(tiedot(j, i) / 1073741824), "0.00") & " GB" End If
Aihe on jo aika vanha, joten et voi enää vastata siihen.