Seite 1 von 2
[gelöst] CD-/DVD-LW unter W98 öffnen
Verfasst: 14.04.2006 17:05
von scholly
moin, moin...
Gibts eine andere Möglichkeit als CDAudio, um unter Win98 das LW zu öffnen ?
Ich hab die Codes aus
http://www.purebasic.fr/german/viewtopi ... ct&start=0
getestet, aber entweder laufen sie nicht unter W98 oder (CDAudio) brauchen >30 Sek zum Öffnen.
Da ich >300 Medien erfassen will, bräuchte ich was, was schneller öffnet und es sollte auf allen Windows-Versionen laufen.
tia...
scholly
Verfasst: 14.04.2006 19:46
von mk-soft
Vielleicht gehts hiermit schneller.
Code: Alles auswählen
Procedure OpenCD()
buffer$=Space(128)
mciSendString_("open cdaudio alias cd",buffer$,128,0)
mciSendString_("SET CD DOOR OPEN",0,0,0)
EndProcedure
Procedure CloseCD()
buffer$=Space(128)
mciSendString_("open cdaudio alias cd",buffer$,128,0)
mciSendString_("SET CD DOOR CLOSED",0,0,0)
EndProcedure
Hatte ich irgend wann mal in Profan geschieben.
FF

Verfasst: 14.04.2006 20:05
von scholly
Danke, aber das ist genauso lahm.
Ich hab erst gedacht, daß es am System/LW liegt, aber irgendwoher hab ich eine kleine eject.exe, die braucht nich so lang.
Kann es sein, daß das daran liegt, daß dort der LW-Buchstabe direkt angegeben werden kann und nicht erst das LW gesucht werden muß ?
Source suchen gehend...
scholly
Verfasst: 14.04.2006 20:15
von mk-soft
Kann ich dir nicht sagen. Hatte ich damals unter win95 am laufen und da hatte es nicht so lange gedauert.
Verfasst: 14.04.2006 21:32
von AND51
Warum geht denn InitCDAudio() nicht?
Verfasst: 14.04.2006 22:15
von scholly
AND51 hat geschrieben:Warum geht denn InitCDAudio() nicht?
Damit braucht das LW mit fast 30 Sekunden fast 5x solange wie ein kompilierter PowerBasic-Code, siehe
http://www.purebasic.fr/german/viewtopic.php?t=7899.
Und bei >300 Medien macht das ganz schön Zeit und nervt einfach nur...
Verfasst: 15.04.2006 12:34
von mk-soft
@scholly
jetze mich mal ran und übersetze das PowerBasic Programm.
etwas geduld bitte.
FF

Verfasst: 15.04.2006 15:27
von mk-soft
Teste das mal:
Code: Alles auswählen
;------------------------------------------------------------------------------
#VWIN32_DIOC_DOS_IOCTL = 1 ; DOS IOCTL commands
#VWIN32_DIOC_DOS_INT25 = 2 ; absolute disk Read
#VWIN32_DIOC_DOS_INT26 = 3 ; absolute disk write
#VWIN32_DIOC_DOS_INT13 = 4 ; INT 13
#VWIN32_DIOC_DOS_DRIVEINFO = 6 ; Win95B Or later
;#IOCTL_STORAGE_BASE = %FILE_DEVICE_MASS_STORAGE
#IOCTL_STORAGE_GET_MEDIA_TYPES = $002D0C00
#IOCTL_STORAGE_GET_MEDIA_TYPES_EX = $002D0C04
#IOCTL_STORAGE_CHECK_VERIFY = $002D4800
#IOCTL_STORAGE_MEDIA_REMOVAL = $002D4801
#IOCTL_STORAGE_EJECT_MEDIA = $002D4808
#IOCTL_STORAGE_LOAD_MEDIA = $002D480C
#IOCTL_STORAGE_RESERVE = $002D4810
#IOCTL_STORAGE_RELEASE = $002D4814
#IOCTL_STORAGE_FIND_NEW_DEVICES = $002D4818
#IOCTL_STORAGE_RESET_BUS = $002D5000
#IOCTL_STORAGE_RESET_DEVICE = $002D5004
Structure DIOC_REGISTERS
regEBX.l
regEDX.l
regECX.l
regEAX.l
regEDI.l
regESI.l
regFlags.l
EndStructure
;------------------------------------------------------------------------------
Procedure.l LoadMedia(drive.s)
Protected hDisk.l
Protected fResult.l
Protected cb.l
Protected Regs.DIOC_REGISTERS
Protected bDisk.l
Protected *Pointer
*Pointer = 0
OS = OSVersion()
If OS = #PB_OS_Windows_95 Or OS = #PB_OS_Windows_98 Or OS = #PB_OS_Windows_ME
bDisk = (Asc(UCase(drive)) - 65) + 1
hDisk = CreateFile_("\\.\vwin32", 0, 0, *n1, 0, #FILE_FLAG_DELETE_ON_CLOSE, 0)
If hDisk = #INVALID_HANDLE_VALUE
Debug "WIN95 #INVALID_HANDLE_VALUE"
ProcedureReturn 0
EndIf
Regs\regEAX = $440D ;eject media
Regs\regEBX = bDisk
Regs\regECX = $0849
fResult = DeviceIoControl_(hDisk, #VWIN32_DIOC_DOS_IOCTL, Regs, SizeOf(DIOC_REGISTERS), Regs, SizeOf(DIOC_REGISTERS), @cb, 0)
If (regs\regFlags And 1) = 1
fResult = 0
EndIf
Else
hDisk = CreateFile_("\\.\"+drive, #GENERIC_READ, 0, *n1, #OPEN_EXISTING, 0, @handle)
If hDisk = #INVALID_HANDLE_VALUE
Debug "WINNT #INVALID_HANDLE_VALUE"
ProcedureReturn 0
EndIf
fResult = DeviceIoControl_(hDisk, #IOCTL_STORAGE_LOAD_MEDIA, 0, 0, 0, 0, @cb, 0)
EndIf
CloseHandle_(hDisk)
ProcedureReturn fResult
EndProcedure
;------------------------------------------------------------------------------
Procedure.l EjectMedia(drive.s)
Protected hDisk.l
Protected fResult.l
Protected cb.l
Protected Regs.DIOC_REGISTERS
Protected bDisk.l
*Pointer = 0
OS = OSVersion()
If OS = #PB_OS_Windows_95 Or OS = #PB_OS_Windows_98 Or OS = #PB_OS_Windows_ME
bDisk = (Asc(UCase(drive)) - 65) + 1
hDisk = CreateFile_("\\.\vwin32", 0, 0, *n1, 0, #FILE_FLAG_DELETE_ON_CLOSE, 0)
If hDisk = #INVALID_HANDLE_VALUE
Debug "WIN95 #INVALID_HANDLE_VALUE"
ProcedureReturn 0
EndIf
Regs\regEAX = $440D ;eject media
Regs\regEBX = bDisk
Regs\regECX = $0849
fResult = DeviceIoControl_(hDisk, #VWIN32_DIOC_DOS_IOCTL, Regs, SizeOf(DIOC_REGISTERS), Regs, SizeOf(DIOC_REGISTERS), @cb, 0)
If (regs\regFlags And 1) = 1
fResult = 0
EndIf
Else
hDisk = CreateFile_("\\.\"+drive, #GENERIC_READ, 0, *n1, #OPEN_EXISTING, 0, @handle)
If hDisk = #INVALID_HANDLE_VALUE
Debug "WINNT #INVALID_HANDLE_VALUE"
ProcedureReturn 0
EndIf
fResult = DeviceIoControl_(hDisk, #IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, @cb, 0)
EndIf
CloseHandle_(hDisk)
ProcedureReturn fResult
EndProcedure
Debug EjectMedia("H:")
Delay(2000)
Debug LoadMedia("H:")
Verfasst: 15.04.2006 22:14
von scholly
SUPER!!!
Herzlichen Dank, auch wenn die Antwort was gedauert hat; heute wars trocken und da waren im Garten die Erdbeerbeete dran und dann bin ich versehentlich eingepennt

Unter W98 genauso fix wie das PowerBasic-Compilat.
Das sollte ins Code-Archiv übernommen werden

Wandert bei mir sofort in die Proc-Sammlung.
happy...
scholly
Verfasst: 15.04.2006 22:57
von Andre
scholly hat geschrieben:Das sollte ins Code-Archiv übernommen werden
Schon gespeichert.
