Ir para conteúdo
Fórum Script Brasil
  • 0

Abrir A Bandeja Do Dvd


luizf

Pergunta

Posts Recomendados

  • 0

Olá...

Uso o código abaixo para abrir o leitor de gravador de CD no trabalho e também o gravador de CD/leitor de DVD em casa:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  // Adicionar MMSystem;
  With MediaPlayer1 do Begin
    If (MediaPlayer1.Mode=mpOpen) then
      mciSendCommand(MediaPlayer1.DeviceID,MCI_SET,
                     MCI_SET_DOOR_CLOSED,0)
    Else
      mciSendCommand(MediaPlayer1.DeviceID,MCI_SET,
                     MCI_SET_DOOR_OPEN,0);
    {EndIf}
  End;{With MediaPlayer1}
End;

Funciona para ambos...

Experimenta....

Ok?

Link para o comentário
Compartilhar em outros sites

  • 0
Sei como abrir a do CD, mas não do DVD.
luizf, utilizo a função mciSendString que, comumente é utilizada para abrir CD's, funciona perfeitamente em meu gravador de DVD.

Dê uma olhada se está sendo retornado algum erro: utilize mciGetErrorString para verificar. Ex.:

procedure TForm1.Button1Click(Sender: TObject);
var
  Erro :LongInt;
  Texto :array[0..128] of char;
begin
  if Boolean(Button1.Tag) then
    Erro := mciSendString('set cdaudio door closed wait', nil, 0, handle)
  else
    Erro := mciSendString('set cdaudio door open wait', nil, 0, handle);

  if mciGetErrorString(Erro, Texto, SizeOf(Texto)) then
    ShowMessage(Texto);

  Button1.Tag := Ord(not Boolean(Button1.Tag));
end;

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz a pergunta pois em casa tenho um computador com os dois dispositivos e com o código tradicional(mencionado acima) ele só abre o gravador de CD. Nos computadores que apresentam apenas um dispositivo ele abre qualquer um que esteja la´. (DVD ou CD)

Link para o comentário
Compartilhar em outros sites

  • 0

Oi pessoal...

Isso é para abrir qualquer unidade pela letra...

Só funciona com leitores de CD... não sei porque não funciona com os DVDs... quem quiser se arriscar a descobrir...

Unit Unit1;

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MMSystem, StdCtrls, MPlayer;

Type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

{********* Abre qualquer unidade (desde que seja CD), pela letra ********}
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;{with OpenParm}
  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;

{********* Fecha qualquer unidade (desde que seja CD), pela letra ********}
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;

{********** Jeito simples ***********}
Procedure TForm1.Button1Click(Sender: TObject);
Begin
  mciSendstring('SET CDAUDIO DOOR OPEN WAIT', nil, 0, Self.Handle);
End;

{********** Abrindo com as funções ***********}

Procedure TForm1.Button2Click(Sender: TObject);
Begin
  // Abre quando os dois são CDs.. quando um é dvd, não abre (o dvd)...
  OpenCD('E');
  OpenCD('F');
End;

Procedure TForm1.Button3Click(Sender: TObject);
Begin
  // Fecha quando os dois são CDs.. quando um é dvd, não fecha (o dvd)...
  CloseCD('E');
  CloseCD('F');
End;

end.

Ok?

Link para o comentário
Compartilhar em outros sites

  • 0

s3c,

testei, mas não funcionou.

Tenho os dois dispositivos e não funcionou.

Será que é porque tem os dois?

A propósito, como poderia descobrir qual o diretório que está instalado o DVD?(Via código é claro?)

Porque com esse abaixo

:
mciSendString('Set cdaudio door open wait', nil, 0, handle);

ele abre o dispositivo sempre do cd quando tem os dois e abre o do dvd quando so tem ele.

Para fechar é só trocar o opem pelo close.

Ou seja, ele não precisa saber qual é a letra onde está o CD.

Link para o comentário
Compartilhar em outros sites

  • 0
uses Variants, ComObj;

var SA:Variant;

begin

SA := CreateOleObject('Shell.Application');

SA.NameSpace(17).ParseName('E:\').InvokeVerb('E&ject');

SA := Unassigned;

end;

opa

testei aqui não funcionou não...

aproveitei e já testei nos 2 drive, não abriu nenhum...

Link para o comentário
Compartilhar em outros sites

  • 0

opa

achei um aqui que funcionou aqui, testa ai

http://www.thescripts.com/forum/thread124082.html

passando pra delphi seria

procedure AbreSafado(const Drive: Char; szAcao: String);

var

szBuff: String;

begin

szBuff := 'open ' + Drive + ':\ type cdaudio alias DRIVE';

mciSendString(PChar(szBuff), nil, 0, 0);

mciSendString(PChar('set DRIVE door ' + szAcao), nil, 0, 0);

mciSendString(PChar('close all'), nil, 0, 0);

end;

ai pra usar

AbreSafado('E', 'open');

troque o E pela letra do Drive só não consegui fazer fechar, mas

como o amigo quis somente saber como abre HUASHUA talvez

ajude

é marquei vi que acima já tem isso ai rsr fiz baseado no do s3c

mas se eu achar uma maneira melhor eu posto aqui

Editado por Churc
Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal, não sei se é o caso mas este código:

var SA:Variant;
begin
  SA := CreateOleObject('Shell.Application');
  SA.NameSpace(17).ParseName('E:\').InvokeVerb('E&ject');
  SA := Unassigned;
end;

Simula o clique do botão direito do mouse no Explorer em cima do drive E, depois procura por Eject(com o 'j' sublinhado e invoca o comando. Como o meu é o XP em inglês, "Eject" é o comando que aparece no menu popup do Explorer. Vejam se o de vocês é diferente como Ejetar, ou outra coisa qualquer e troquem pelo que aparece. Talvez seja isso.

Link para o comentário
Compartilhar em outros sites

  • 0

s3c,

usando

SA.NameSpace(17).ParseName('G:\').InvokeVerb('E&jetar');

funciona!!

Pena que não teria um análogo para fechar!!

Mas, como eu faço para descobrir. via código, qual a letra do DVD.

Tem algum código, tipo daqueles ,que descobrem onde está instalado o windows?

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo,

1-O seu DVD, pelo Explorer você tem a opção no botão direito do mouse de ejetar ?

2-Aonde ele aparece ? abaixo do My Computer no mesmo nível do CDROM ?

3-Com que nome ele aparece ?

ps: se não tiver a opção de ejetá-lo pelo mouse, acho que Shell Application não servirá.

Link para o comentário
Compartilhar em outros sites

  • 0

ahh sim verdade aqui funcionou também, achei que E&ject fosse comando

e não que tivesse haver com o Ejetar do menu do explorer rsr

até tirei o & achando que era erro de escrita...

pu.tz o Windows é foda meu, vai vendo os recursos que ele

da suporte, olha isso que absurdo uhahuashu :rolleyes:

abs

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, eu tenho apenas um Gravador de DVD, então acho que não estou entendendo direito o problema, pois a alguns posts acima (post do Paulo Bergo) o comando que está aparentemente configurado para executar no CD - cdaudio (ele comenta que funciona apenas com CD) está funcionando com meu gravador. E se eu trocar por digitalvideo ou videodisc não funciona. Alguém tentou com estes antes?

Os device types deveriam ser um destes: cdaudio, digitalvideo, videodisc

ou MCI_DEVTYPE_CD_AUDIO, MCI_DEVTYPE_DIGITAL_VIDEO, MCI_DEVTYPE_VIDEODISC; quando aplicável (msdn).

s3c, mas se pode haver problemas com o idima, será que é uma boa saída?

Link para o comentário
Compartilhar em outros sites

  • 0
s3c, mas se pode haver problemas com o idima, será que é uma boa saída?
Bom, você pode saber os ítens do menu popup que o Explorer apresenta:
var i:Integer; SA:Variant;
begin
  SA := CreateOleObject('Shell.Application');
  for i := 0 to SA.NameSpace(17).ParseName('D:\').Verbs.Count-1 do
    Memo1.Lines.Add(SA.NameSpace(17).ParseName('D:\').Verbs.Item(i).Name);
  SA := Unassigned;
end;
Utilizei um TMemo para visualizar, mas a cada iteração do for você pode checar o E&ject pertinente para aquele computador e depois executar o InvokeVerb. Existe outra opção, sabendo-se a letra do drive, mandando diretamente o código de controle para o dispositivo(abrir ou fechar):
const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C;
var hDevice:THandle; dRet:DWord;
begin
  HDevice := CreateFile(PChar('\\.\E:'),
                        Generic_Read or Generic_Write,
                        0,
                        nil,
                        Open_Existing,
                        0,
                        0);
  DeviceIoControl(hDevice, IOCTL_Storage_Eject_Media, nil, 0, nil, 0, dRet, nil); // Ejeta
  DeviceIoControl(hDevice, IOCTL_Storage_Load_Media,  nil, 0, nil, 0, dRet, nil); // Fecha
  CloseHandle(hDevice);
end;

No caso foi utilizado E:

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c

Olá Paulo,

1-O seu DVD, pelo Explorer você tem a opção no botão direito do mouse de ejetar ?

Sim

2-Aonde ele aparece ? abaixo do My Computer no mesmo nível do CDROM ?

Abaixo do Meu Computador no mesmo nível do CDROM

3-Com que nome ele aparece ?

Unidade de DVD-RAM(G:)

ps: se não tiver a opção de ejetá-lo pelo mouse, acho que Shell Application não servirá.

Mas, eu já havia dito, s3c,no post acima do seu(#16), que funcionou para mim.

O que eu disse foi o seguinte:

funciona!!

Pena que não teria um análogo para fechar!!

Mas, como eu faço para descobrir. via código, qual a letra do DVD.

Tem algum código, tipo daqueles ,que descobrem onde está instalado o windows?

Tem como?

Não havendo, a única coisa que me vem a cabeça é fazer uso do velho e amigo registro.

Na primeira vez que usar o comando , abre uma tela para o usuário dizer qual a letra correspondente ao seu DVD, grava no registro e sempre que abrir o programa trás ela para o lugar ocupado pelo 'E" no código acima. Alguém tem outra idéia melhor?

Testei

DeviceIoControl(hDevice, IOCTL_Storage_Load_Media,  nil, 0, nil, 0, dRet, nil); // Fecha
Aqui não funciona. O compilador esta mandando também as mensagens de que:
[Hint] Unit1.pas(91): Value assigned to 'hDevice' never used
[Hint] Unit1.pas(89): Variable 'dRet' is declared but never used in 'TForm1.Button4Click'

Editado por Paulo Nobre
Link para o comentário
Compartilhar em outros sites

  • 0

Legal esse tópico! Segui a dica do s3c ("Shell.Application") e funcionou! O mais legal é que eu não conhecia esse objeto COM/ActiveX chamado 'Shell.Application', interessante.

Falows!

P.S: Só que eu fiz o teste no VB6. Mas o que importa? É um objeto COM/ActiveX : )

Link para o comentário
Compartilhar em outros sites

  • 0
Unidade de DVD-RAM(G:)

Mesmo trocando a unidade por G:\ não funciona?

Se não funcionar, tente acessar o ítem pelo nome que aparece:

var i:Integer; SA:Variant;
begin
  SA := CreateOleObject('Shell.Application');
  for i := 0 to SA.NameSpace(17).Items.Count-1 do
  begin
    if Pos('DVD-RAM', SA.NameSpace(17).Items.Item(i).Name) > 0 then
      SA.NameSpace(17).Items.Item(i).InvokeVerb('E&jetar');
  end;
  SA := Unassigned;
end;
DeviceIoControl(hDevice, IOCTL_Storage_Load_Media,  nil, 0, nil, 0, dRet, nil); // Fecha
Aqui não funciona. O compilador esta mandando também as mensagens de que:
[Hint] Unit1.pas(91): Value assigned to 'hDevice' never used
[Hint] Unit1.pas(89): Variable 'dRet' is declared but never used in 'TForm1.Button4Click'

Esses dois Hints acho que estão dizendo que ele está executando CreateFile mas não está executando DeviceIoControl. Poste o código do Button4Click.

Link para o comentário
Compartilhar em outros sites

  • 0

s3c, essa idéia do uso do uso de DeviceIOControl (IOCTL) mais interessante, já que não depende de questões como idioma, o que torna mais genérico seu uso.

Ficamos de quaquer modo, para ambas as opções, com a questão de saber qual a letra do CD ou DVD, certo?!

Então, eu havia encontrado no site ma Micro$oft um exemplo de como obter informações, justamente utilizando recursos IOCTL, sobre como descobrir quantos, quais e detalhes dos drivers de CD's instalados. O detalhe é que achei o código meio comprido, em C++ e estou meio sem tempo para converter. Talvez algum colega, se habilite a dar uma enxugada no código de modo apenas a obter os drivers (respectivas letras) para serem utizados com com a opção que você postou utilizando IOCTL.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0
s3c, essa idéia do uso do uso de DeviceIOControl (IOCTL) mais interessante, já que não depende de questões como idioma, o que torna mais genérico seu uso.

Ficamos de quaquer modo, para ambas as opções, com a questão de saber qual a letra do CD ou DVD, certo?!

Pelo DeviceIOControl acho que sim, por outro lado, pelo Shell.Application, você consegue pesquisar o nome do FolderItem e aplicar o InvokeVerb sem saber a letra:
var i:Integer; SA:Variant;
begin
  SA := CreateOleObject('Shell.Application');
  for i := 0 to SA.NameSpace(17).Items.Count-1 do
  begin
    if Pos('DVD-RAM', SA.NameSpace(17).Items.Item(i).Name) > 0 then
      SA.NameSpace(17).Items.Item(i).InvokeVerb('E&jetar');
  end;
  SA := Unassigned;
end;

É claro que para um código que funcione em qualquer máquina, devem ser checados os possíveis nomes que possam vir de CD e DVD; o que tornaria uma rotina bastante trabalhosa, além do que você só consegue ejetar a unidade.

Talvez pelo IOCTL e CreateFile retornando um Handle válido, o DeviceIOControl seria a forma mais direta e eficaz de abrir e fechar as bandejas.

Link para o comentário
Compartilhar em outros sites

  • 0

s3c

Para abrir está funcionando normalmente!!

Para fechar, não.

O código do button4click é:

procedure TForm1.Button4Click(Sender: TObject);
const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C;
var hDevice:THandle; dRet:DWord;
begin
  HDevice := CreateFile(PChar('\\.\g:'),
                        Generic_Read or Generic_Write,
                        0,
                        nil,
                        Open_Existing,
                        0,
                        0);
  //DeviceIoControl(hDevice, IOCTL_Storage_Eject_Media, nil, 0, nil, 0, dRet, nil); // Ejeta
  DeviceIoControl(hDevice, IOCTL_Storage_Load_Media,  nil, 0, nil, 0, dRet, nil); // Fecha
  CloseHandle(hDevice);
end;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...