[erledigt] Powerbasic-Code --> PureBasic

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[erledigt] Powerbasic-Code --> PureBasic

Beitrag von scholly »

moin, moin...
Gibts hier zufälligerweise jemanden, der sich sowohl mit PureBasic als auch PowerBasic auskennt und nachfolgenden Code oder zumindest die beiden Functionen Konvertieren kann ?

tia...
scholly

Code: Alles auswählen

'==============================================================================
'
'  EJECT.BAS - Eject CD tray
'  Compile using the PowerBASIC Console Compiler for Windows (PB/CC)
'
'==============================================================================

#INCLUDE "WIN32API.INC"

'------------------------------------------------------------------------------

$Version   = "EJECT v2.02 - Removable Media Eject/Load"
$Copyright = "Copyright (c) 1998-2001 WebGeek, Inc."

'------------------------------------------------------------------------------

GLOBAL w95 AS LONG

'------------------------------------------------------------------------------

FUNCTION EjectMedia(BYVAL drive AS STRING) AS LONG

  LOCAL hDisk   AS LONG
  LOCAL fResult AS LONG
  LOCAL cb      AS LONG
  LOCAL Regs    AS DIOC_REGISTERS
  LOCAL bDisk   AS LONG

  IF w95 THEN
    bDisk = (ASC(UCASE$(drive)) - 65) + 1
    hDisk = CreateFile("\\.\vwin32", 0, 0, BYVAL %NULL, 0, %FILE_FLAG_DELETE_ON_CLOSE, %NULL)

    IF hDisk = %INVALID_HANDLE_VALUE THEN
      EXIT FUNCTION
    END IF

    Regs.regEAX = &H440D  'eject media
    Regs.regEBX = bDisk
    Regs.regECX = &H0849

    fResult = DeviceIoControl(hDisk, %VWIN32_DIOC_DOS_IOCTL, Regs, SIZEOF(Regs), Regs, SIZEOF(Regs), cb, BYVAL %NULL)

    IF (regs.regFlags AND 1) = 1 THEN
      fResult = 0
    END IF
  ELSE
    hDisk = CreateFile("\\.\"+drive, %GENERIC_READ, 0, BYVAL %NULL, %OPEN_EXISTING, 0, %NULL)

    IF hDisk = %INVALID_HANDLE_VALUE THEN
      EXIT FUNCTION
    END IF

    fResult = DeviceIoControl(hDisk, %IOCTL_STORAGE_EJECT_MEDIA, BYVAL %NULL, 0, BYVAL %NULL, 0, cb, BYVAL %NULL)
  END IF

  CloseHandle hDisk

  IF fResult THEN
    FUNCTION = -1
  END IF

END FUNCTION

'------------------------------------------------------------------------------

FUNCTION LoadMedia(BYVAL drive AS STRING) AS LONG

  LOCAL hDisk   AS LONG
  LOCAL fResult AS LONG
  LOCAL cb      AS LONG
  LOCAL Regs    AS DIOC_REGISTERS
  LOCAL bDisk   AS LONG

  IF w95 THEN
    bDisk = (ASC(UCASE$(drive)) - 65) + 1
    hDisk = CreateFile("\\.\vwin32", 0, 0, BYVAL %NULL, 0, %FILE_FLAG_DELETE_ON_CLOSE, %NULL)

    IF hDisk = %INVALID_HANDLE_VALUE THEN
      EXIT FUNCTION
    END IF

    Regs.regEAX = &H440D  'eject media
    Regs.regEBX = bDisk
    Regs.regECX = &H0849

    fResult = DeviceIoControl(hDisk, %VWIN32_DIOC_DOS_IOCTL, Regs, SIZEOF(Regs), Regs, SIZEOF(Regs), cb, BYVAL %NULL)

    IF (regs.regFlags AND 1) = 1 THEN
      fResult = 0
    END IF
  ELSE
    hDisk = CreateFile("\\.\"+drive, %GENERIC_READ, 0, BYVAL %NULL, %OPEN_EXISTING, 0, %NULL)

    IF hDisk = %INVALID_HANDLE_VALUE THEN
      EXIT FUNCTION
    END IF

    fResult = DeviceIoControl(hDisk, %IOCTL_STORAGE_LOAD_MEDIA, BYVAL %NULL, 0, BYVAL %NULL, 0, cb, BYVAL %NULL)
  END IF

  CloseHandle hDisk

  IF fResult THEN
    FUNCTION = -1
  END IF

END FUNCTION

'------------------------------------------------------------------------------

FUNCTION PbMain() AS LONG

  LOCAL drive  AS STRING
  LOCAL ErText AS ASCIIZ * 64
  LOCAL e      AS LONG
  LOCAL vi     AS OSVERSIONINFO
  LOCAL dt     AS LONG
  LOCAL ej     AS LONG

  STDOUT $Version
  STDOUT $Copyright
  STDOUT ""

  vi.dwOsVersionInfoSize = SIZEOF(vi)
  GetVersionEx vi
  w95 = (vi.dwPlatformId = %VER_PLATFORM_WIN32_WINDOWS)

  IF LEN(COMMAND$) THEN

    drive = UCASE$(LEFT$(COMMAND$, 1) + ":")

    ej = INSTR(LCASE$(COMMAND$), "/l") = 0

  ELSE

    STDOUT "Usage:  eject drive [/l]"
    STDOUT ""
    STDOUT "  /l          load (does not work with all CDROM drives)"
    EXIT FUNCTION

  END IF

  dt = GetDriveType(BYCOPY drive)

  SELECT CASE DT

    CASE %DRIVE_REMOVABLE
      IF ej THEN
        STDOUT "Ejecting Removable drive " & drive;
        e = EjectMedia(drive) AND 1
      ELSE
        STDOUT "Loading Removable drive " & drive;
        e = LoadMedia(drive) AND 1
      END IF
      STDOUT ""

    CASE %DRIVE_CDROM
      IF ej THEN
        STDOUT "Ejecting CDROM drive " & drive;
        e = EjectMedia(drive) AND 1
      ELSE
        STDOUT "Loading CDROM drive " & drive;
        e = LoadMedia(drive) AND 1
      END IF
      STDOUT ""

    CASE ELSE
      STDOUT "Error! Invalid drive type."

  END SELECT

  FUNCTION = e

END FUNCTION
Zuletzt geändert von scholly am 21.04.2008 23:54, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Findest Du im CodeArchiv: EjectLoad-CDTray.pb
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Das hilft mir nicht, denn
;Eject & Load CDTray
;###################
;NT, XP & W2K
;###################
während die PowerBasic-exe problemlos und schnell mit W98 funktioniert.
Allerdings bin ich zu grün um die Funktionen selber zu portieren.
Was ich an Code hier in den Foren oder im Codearchiv gefunden habe, tuts entweder nicht unter W98 oder wesentlich langsamer ( und bei Hunderten CDs machts schon was aus, ob Öffnen 5 oder 25 Sekunden dauert).
bis denne...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Der Win95 Teil ist doch sehr ähnlich. Ich hab kein Win95, kanns also nicht
Testen, aber die Anpassung sollte einfach sein. (PowerBasic kann ich auch
nicht :wink: )
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

ts-soft hat geschrieben:Der Win95 Teil ist doch sehr ähnlich. Ich hab kein Win95, kanns also nicht Testen, aber die Anpassung sollte einfach sein. (
Hab auch kein 95 sondern 98, aber keinen Schimmer, wie ich das portieren könnte :(
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Den Code aus dem CodeArchiv nehmen und die Parameter bei:
CreateFile
DeviceIoControl
anpassen, entsprechend den Parameter im PowerBasic Source. Evtl. noch
in der MSDN nachsehen. So groß ist der Unterschied nicht, Dir fehlt aber
anscheinend noch der richtige Blick dafür :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

ts-soft hat geschrieben: So groß ist der Unterschied nicht, Dir fehlt aber
anscheinend noch der richtige Blick dafür :wink:
Der Kandidat hat 99 Punkte :)
Ich sitz jetzt fast 2 Stunden da drüber und blicks nich. Am wenigsten komm ich mit dem "LOCAL Regs AS DIOC_REGISTERS " zurecht und wie die Werte dann eingesetzt werden.
Abba jezz schlaf ich ersma ne Runde, vielleicht bekomm ich über Nacht ja ne Erleuchtung.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Mußte mal testen:

Code: Alles auswählen

#IOCTL_STORAGE_EJECT_MEDIA  = $2D4808 
#IOCTL_STORAGE_LOAD_MEDIA   = $2D480C 

Procedure.l IsWinNT()
  If GetVersion_() & $FF0000
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure EjectCD(LW.s) 
  Protected hLwStatus.l 
  If IsWinNT()
    hLwStatus = CreateFile_("\\.\"+LW,#GENERIC_READ|#GENERIC_WRITE, 0, 0, #OPEN_EXISTING, 0, 0) 
    If hLwStatus 
      DeviceIoControl_(hLwStatus,#IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,@Ret,0) 
      CloseHandle_(hLwStatus) 
    EndIf
  Else
    hLwStatus = CreateFile_("\\.\vwin32", 0, 0, 0, 0, #FILE_FLAG_DELETE_ON_CLOSE, 0) 
    If hLwStatus 
      DeviceIoControl_(hLwStatus,#IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,@Ret,0) 
      CloseHandle_(hLwStatus) 
    EndIf
  EndIf 
EndProcedure  
Keine Ahnung ob das so geht
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Beitrag von walker »

Hi,

wie wäre es mit

Code: Alles auswählen

EjectAudioCD(Status)
:?: :?:
(siehe PB-Hilfe für weitere Info)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

walker hat geschrieben:Hi,

wie wäre es mit

Code: Alles auswählen

EjectAudioCD(Status)
:?: :?:
(siehe PB-Hilfe für weitere Info)
Zu lahm :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten