E aí pessoal....

Eu tenho uma rotina para fazer isso, ralei mas consegui. Existe um 
montão na internet, mas a minha function abre o drive que desejar, 
enquanto que, os que rola aí na internet só abre o drive principal. 
Digamos que você esteja rodando a aplicação em um drive virtual de CD ou 
o usuário possui dois drive de CD, o comando que existe pela internet, 
só vai abrir o drive de CD físico e o principal.

Bom, meu problema é que meu aplicativo vai funcionar apenas de dentro do 
CD. Já está completo, mas tenho um problema e uma solução, mas queria 
encontrar outra solução. Na hora que o usuário sair do aplicativo, tenho 
de ejetar o CD.

Problema: Colocar no CloseQuery não dá certo, até ejeta, mas depois gera 
um erro solicitando que seja inserido o CD do programa no drive. Aí não 
vai dar, claro...
Se eu colocar no onClose acontece a mesma coisa, já fiz de tudo, antes 
eu chamava a function, depois resolvi colocar o comando diretamente no 
onClose, as vezes funciona, as vezes não...


Solução: Criar um utilitário e colocar ele dentro desse programa, jogar 
ele nos temporários e executá-lo ao sair do aplicativo, dá certo, porém 
fica uma coisa meio sujo. Como eu faria para ao finalizar o programa o 
drive fosse ejetado e não aparecer o erro pedindo para recolocar o CD no 
drive????

A function que fiz que abre qualquer unidade de CD:

-------------------------------------------------------------------------
function Tfrm_Principal.Ejetar : Boolean;
var
  OpenP : TMCI_Open_Parms;
  Flg : DWord;
  DeviceID : Word;
  MErrou  : MciError;
begin
  Result := False;
  Flg := mci_Open_Type or mci_Open_Element;

  with OpenP do
    begin
      dwCallback := 0;
      lpstrDeviceType := 'CDAudio';
      lpstrElementName := PChar(ExtractFileDrive(Application.ExeName));
    end;

  MErrou := mciSendCommand(0, mci_Open, Flg, Longint(@OpenP));
  if MErrou <> 0 then
    Exit;

  DeviceID := OpenP.wDeviceID;

  try
    MErrou := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
    if MErrou = 0 then
      Exit;

    Result := True;

  finally
    mciSendCommand(DeviceID, mci_Close, Flg, Longint(@OpenP));
  end;
end;
--------------------------------------------------------------------------

Grato pela ajuda...

Responder a