12. januar 2011 - 14:02Der er
15 kommentarer og 1 løsning
Checke om CD er åben
Hvordan kan jeg checke om CD ROM drevet er åben ?
Jeg har en computer hvor åbne/lukke knappen til CD drevet ikke er så god mere og så vil jeg lave et lille program der åbner CD drevet hvis det er lukket. Hvis det til gengæld er åben, skal det lukkes.
Jeg har en funktion der kan åbne og lukke, men jeg mangler et check for hvad der skal gøres.
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; FUNCTION OpenCD(Drive : Char) : Boolean; FUNCTION CloseCD(Drive : Char) : Boolean; FUNCTION LokCD() : Char; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
FUNCTION TForm1.OpenCD(Drive : Char) : Boolean; Var Res : MciError; OpenParm : TMCI_Open_Parms; Flags : DWord; S : String; DeviceID : Word; BEGIN Result := False; S := Drive + ':'; Flags := Mci_Open_Type or Mci_Open_Element; WITH OpenParm DO BEGIN dwCallback := 0; lpstrDeviceType := 'CDAudio'; lpstrElementName := PChar(S); END; Res := MciSendCommand(0, mci_Open, Flags, Longint(@OpenParm)); IF Res <> 0 THEN Exit; DeviceID := OpenParm.wDeviceID; try Res := MciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0); IF Res = 0 THEN Exit; Result := True; finally MciSendCommand(DeviceID, Mci_Close, Flags, Longint(@OpenParm)); END; END;
FUNCTION TForm1.CloseCD(Drive : Char) : Boolean; Var Res : MciError; OpenParm : TMCI_Open_Parms; Flags : DWord; S : String; DeviceID : Word;
BEGIN Result := False; S := Drive + ':'; Flags := Mci_Open_Type or mci_Open_Element; With OpenParm do BEGIN dwCallback := 0; lpstrDeviceType := 'CDAudio'; lpstrElementName := PChar(S); END; Res := MciSendCommand(0, mci_Open, Flags, Longint(@OpenParm)); IF Res <> 0 THEN Exit; DeviceID := OpenParm.wDeviceID; try Res := MciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); IF Res = 0 THEN Exit; Result := True; finally MciSendCommand(DeviceID, Mci_Close, Flags, Longint(@OpenParm)); END; END;
FUNCTION TForm1.LokCD() : Char; VAR Drv : String; DrvU : Pchar; Fundet : Boolean;
BEGIN Fundet := False; Drv := 'C' + ':' + #0; REPEAT DrvU := Pchar(Drv); IF GetDriveType(DrvU) = DRIVE_CDROM THEN Fundet := True ELSE Inc(Drv[1]); UNTIL ((Fundet = True) OR (Char(Drv[1]) = 'Z')); IF Char(Drv[1]) = 'Z' THEN Result := #0 ELSE Result := Char(Drv[1]); END;
procedure TForm1.Button1Click(Sender: TObject); begin OpenCD('J'); end;
procedure TForm1.Button2Click(Sender: TObject); begin CloseCD('J'); end;
function OpenCD(Drive : Char) : Boolean; var Res: MciError; OpenParm: TMCI_Open_Parms; Flags: DWord; S: string; DeviceID: Word; begin Result := False; S := Drive + ':'; Flags := Mci_Open_Type or Mci_Open_Element; with OpenParm do begin dwCallback := 0; lpstrDeviceType := 'CDAudio'; lpstrElementName := PChar(S); end; Res := MciSendCommand(0, mci_Open, Flags, Longint(@OpenParm)); if Res <> 0 then Exit; DeviceID := OpenParm.wDeviceID; try Res := MciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0); if Res = 0 then Exit; Result := True; finally MciSendCommand(DeviceID, Mci_Close, Flags, Longint(@OpenParm)); end; end;
function CloseCD(Drive : Char): boolean; var Res: MciError; OpenParm: TMCI_Open_Parms; Flags: DWord; S: string; DeviceID: Word; begin Result := False; S := Drive + ':'; Flags := Mci_Open_Type or mci_Open_Element; With OpenParm do begin dwCallback := 0; lpstrDeviceType := 'CDAudio'; lpstrElementName := PChar(S); end; Res := MciSendCommand(0, mci_Open, Flags, Longint(@OpenParm)); if Res <> 0 then Exit; DeviceID := OpenParm.wDeviceID; try Res := MciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); if Res = 0 then Exit; Result := True; finally MciSendCommand(DeviceID, Mci_Close, Flags, Longint(@OpenParm)); end; end;
function LokCD(): Char; var Drv: string; DrvU: Pchar; Fundet: Boolean; begin Fundet := False; Drv := 'C' + ':' + #0; repeat DrvU := Pchar(Drv); if GetDriveType(DrvU) = DRIVE_CDROM then Fundet := True else Inc(Drv[1]); until ((Fundet = True) OR (Char(Drv[1]) = 'Z')); if Char(Drv[1]) = 'Z' then Result := #0 else Result := Char(Drv[1]); end;
// **************************************************************************** var Drive: char; begin try if ParamStr(1) <> '' then Drive := ParamStr(1)[1] else Drive := LokCD; OpenCD(Drive); OpenCD(Drive); except end; end.
(Jeg har en eller anden INDBYGGET SLÅFEJL at skrive korrket istedet for KORREKT- bær over med det... !)
Brugte aftenen sammen med konen, TV, kaffe, hygge, smøreost og en lille smule delphi.
Hentede mit program (skrevet for Delp-4 i 2003) og gennemgik koden for at (prøve) at huske hvad det var prgm. skulle gøre.
Efter nogen tid:
Prgm, skulle ved opstart checke begge CD-drev om det var den korrekte CD i et af disse drev. Hvis dette ikke var tilfældet (altså fejl CD eller ingen CD ) skulle programmet skrive en fejl-meddelelse (HTML) til bruger, åbne CD-skuffen i første CD-drev og vente på tilbagemelding, og gentage "requesten" indtil korrekt CD (altså en uendelig sløjfe - afbrudt af indlæggelse af korrket CD eller PRGM-afslutning).
Jeg husker også (hjulpet af dokumentationen (!) ), at jeg lagde CloseCD funktionen ind (som en service overfor brugeren).
Jeg har gennemgået din udgave af prgm. på virtuelt plan og påtænker at lægget det ind i D7 i løbet af dagen. Jeg finder ikke umiddelbart noget galt. Jeg vil melde tilbage i løbet af dagen (eller evt. i morgen).
Jeg husker at jeg et eller andet sted så en masse ASSEMBLER (386 ASM) på styringen af et CD-rom drev. Fandt koden interessant og downloadede det på en ÆLDGAMMEL Compaq -75 ( 50 MHZ 486 PC), men om jeg stadig har koden (og PC'en) ved jeg ikke (i så fald er det dybest i kælderen, derinde hvor de rigtige mus holder til....).
Men det kunne måske være anledningen til den længe ønskede oprydning ? (Og så ved jeg at konen bliver (mere) lykkelig (he he) )
Selv om det ikke kom til at fungere efter hensigten har jeg givet dig fortjente points for indsatsen.
Kan simpelthen ikke få den til at lukke skuffen hvis den står åben når programmet køres.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.