Downloads

MyEject

Público alvo: desenvolvedores e usuários avançados fazendo experiências com autourun/autoplay;
Autor: Eu mesmo :-)
Preço:
Gratuito (freeware)
Desenvolvido em:
Delphi 7 (Win32 nativo).
Requer:
Testado por mim no Windows XP, mas deve ser compatível também com 2000, 2003, Vista e Seven (dificilmente rodará no 9X).

MyEject é um utilitário com um propósito bem simples: abrir e fechar unidades de CD/DVD. Para a maioria dos usuários isso parece tolice, mas eu precisei escrever esse software porque necessitava de algo assim e em vez de buscar algo pronto decidi fazer um como exercício de programação.

Eu estou desenvolvendo um outro software que precisa detectar a inserção de novas mídias (não apenas CD/DVD) e reagir de acordo com o conteúdo.  Durante os testes é preciso abrir e fechar o drive várias vezes, mas meus drives ficam longe, requerendo que eu fique de pé para fazer isso.  MyEject resolve o problema.

Eu poderia fazer esses testes usando emulação (Daemon Tools, Virtual CloneDrive, Alcohol 120%, etc) , mas a versão do Daemon Tools que eu prefiro usar requer cliques demais para montar e desmontar mídia. Com MyEject as operações ficam resumidas a um ou dois cliques apenas.

Compatível com o modo multimonitor

O programa memoriza a última posição da janela, trazendo o programa sempre para a mesma posição, no mesmo monitor. Mas por precaução, se ao ser executado ele notar que uma de suas coordenadas excede o tamanho atual da área de trabalho (ou seja: não vai ficar visível), as coordenadas são resetadas para o canto superior esquerdo da tela (0,0). Se algo der muito errado e isso não estiver funcionando, basta editar manualmente o arquivo .INI.

Portabilidade

Em todos os meus softwares eu uso arquivos *.INI em vez do Registro. Assim você pode carregar o programa em um pendrive e também pode usar duas instâncias do programa, cada uma com sua configuração.

Usando por linha de comando

myEject letra_da_unidade [/l] [/load]

Exemplos:

myeject k: – abre a unidade k:

myeject k: /l (ou /load) – fecha a unidade k:

Para ganhar tempo, quando usado por linha de comando o programa nem tenta determinar se a unidade existe ou se é mesmo um drive de CDROM. Do contrário haveria uma pausa de vários segundos. Eu decidi que é melhor deixar por conta do usuário se certificar de que a letra de unidade esteja correta. Porém, nos casos em que o usuário tenha apenas UM DRIVE (contando reais mais emulados) é possível fazer o programa dar OPEN ou CLOSE mesmo sem especificar unidade. Eu vou checar a possibilidade de acrescentar essa funcionalidade em uma futura versão.

Observações:

  • A detecção de unidades emuladas é feita de forma bem grosseira: eu apenas detecto a palavra “generic” que o Daemon Tools usa no seu “Friendly Name” (o nome que aparece no Gerenciador de Dispositivos). Se você usa um outro emulador que não é detectado como tal, deixe um comentário me dizendo qual o seu “Friendly Name” típico.
  • No Windows Vista/Seven provavelmente vai ser preciso rodar o programa como Administrador.
  • Um asterisco ao lado da letra de unidade indica que um disco foi detectado na mesma. Quando possível, seu label também será exibido à direita.
  • Se o seu drive não aparece na lista, isso significa que o Windows não considera que seja um drive de CD/DVD (não é da classe Win32_CDROMdrive);
  • Se o comando Abrir funciona mas o comando Fechar, não. Verifique se a luz no drive está acendendo ao clicar em Fechar. Se estiver, você tem um problema mecânico no drive. Se não estiver, deixe um comentário detalhando ao máximo sua configuração.
  • A função “Ciclo” abre e fecha o drive logo em seguida;
  • Opção para interface “mínima” mostrando apenas o botões de operação, para ocupar pouco espaço na tela;
  • O tempo de refresh depende do número de unidades com mídia inserida, porque o processo mais demorado é consultar os dados da mídia.

Coisas que posso fazer em futuras versões :

  • A funcionalidade extra especificada em “Usando por linha de comando”;
  • Programar abertura e fechamento a intervalos regulares (basta encontrar utilidade ou alguém justificar);

Se você tem uma necessidade específica relacionada que gostaria de ver implementada, deixe um comentário. Estou aberto a sugestões.

Você também pode usar o espaço de comentários para simplesmente explicar que utilidade encontrou para o programa. Isso pode me ajudar a ter idéias de melhorias;

Histórico

Versão 0.2.3

  • Mensagens de disco inserido agora dizem o label do disco;
  • “Omitir Emuladas” não é mais o default do programa;
  • O programa agora checa se o número de unidades detectadas é menor que 1, para evitar travamentos;
  • A string “CloneDrive” foi acrescentada à lista interna de emuladores;
  • Agora o programa reage a um clique duplo sobre cada item. Se houver um asterisco, tenta ejetar. Se não houver,  tenta fechar. Lembrando que um item sem asterisco pode ser um drive fechado vazio. E isso não pode ser detectado;
  • E algumas alterações cosméticas.

Versão 0.2.2

  • Corrigi um bug que fazia o programa dar um refresh a cada inserção ou remoção de dispositivos não CD/DVD;
  • Acrescentei uma barra de status para ajudar no debug (mostrará o que o programa estava fazendo quando travou);
  • Aperfeiçoei a enumeração feita em “Copiar a enumeração completa…”.

Versão 0.2.1

  • Corrigi um bug idiota que só permitia que o programa funcionasse com uma determinada combinação de drives, se estiver marcada a opção de filtrar drives emulados. Como essa opção é default do programa, provocava travamento imediato ao rodar.

Versão 0.2

  • O programa agora detecta ao fechar se houve erro ao gravar o arquivo INI e dá uma mensagem ao usuário;
  • Função Ciclo. Disponível para drives com mídia na bandeja;
  • O programa agora dá um aviso claro de que está atualizando os dados;
  • implementei uma Interface Mínima;
  • Agora você pode usar também “/load” (além de “/l”) na linha de comando para fechar o drive;
  • incluí itens no menu Ajuda para ajudar no debug da aplicação.
  • E algumas mudanças cosméticas

——————————–
Versão 0.1

Primeira versão publicada

DOWNLOAD

244.9 KiB - 204 Downloads - Detalhes...

244.3 KiB - 82 Downloads - Detalhes...

240.1 KiB - 65 Downloads - Detalhes...

240.1 KiB - 62 Downloads - Detalhes...

236.1 KiB - 70 Downloads - Detalhes...

22 comments to MyEject

  • Marcio

    Parabéns pela ideia! achei muito interessante, vou baixa para testar!!! Valeu pela iniciativa!!!

  • Dyeison

    Ola, testei o MyEject no Windows Seven. Rodei como Admin e User. Ele detectou as unidades normalmente, mas travou logo, não permitindo clicar nos botões. Uma das unidades exibidas é virtual, DaemonTools, e aparece como IXY MFK5M701Y SCSI CdRom Device. .

  • Coloquei online a versão 0.2 do programa.

  • Dyeison

    Nossa, nem sabia que existia esse tal de Yasu, não o utilizo, deve estar integrado ao Daemon Tools. Versão 0.2 com o mesmo comportamento da 0.1 no Seven.

  • Dyeison

    Ah, testei no Windows Server 2003, agora a pouco, e o comportamento foi igual ao do Seven. Achei estranho, pois você está usando o XP, e o Server é praticamente igual, deveria funcionar…

  • Testei o programa no Windows 7. Funciona parcialmente. Dos meu dois drives físicos (SATA e IDE), ele só consegue ejetar o IDE no seven. No XP, na mesma máquina, tudo funciona.

  • Jefferson, testei aqui no Windows 2000 SP4.

    Ao executar pela primeira vez, dá o erro “List index out of bounds (-1)”. clicando em OK, o programa fica exibindo indefinidamente a mensagem “Atualizando. Demora alguns segundos…” e o cursor do mouse fica em modo “ocupado” (ampulheta) sobre a janela do programa.

    Fechando programa normalmente (não precisa matar no gerenciador) e abrindo novamente ele não dá mais o erro mas não detecta nenhum drive de CD/DVD.

    O arquivos .INI criado tem o seguinte conteúdo:

    [GERAL]
    SavedLetter=
    OmitirEmuladas=1
    SempreVisivel=0
    InterfaceMinima=0
    Left=391
    Top=141

    Copiar a enumeração completa gera o seguinte:

    MyEJECT – v0.2.2 beta – byRyan
    Enumeração completa da classe Win32_CDROMDrive para debug

    Drives que estão instalados na maquina (vistos pelo gerenciador de dispositivos):
    ELBY CLONEDRIVE SCSI CdRom Device
    HL-DT-ST DVD-RAM GH22NS30
    LG CD-RW CED-8120B

    O ELBY é emulação (Duh! 🙂
    O DVD-RAM é um drive SATA
    O CD-RW é um drive IDE

    Espero que sirva de alguma ajuda. Se tiver novas versões ou intenção de corrigir isto, eu testo novamente.

    • Isso é estranho, Luciano. Eu acabo de testar em uma VM Windows 2000 SP4 e o programa funcionou. Meu programa requer o “Microsoft WMI Scripting 1.2” (que deveria estar presente no 2000 SP4) e que o serviço WMI esteja rodando. Eu vou tentar incluir rotinas no programa para checar esses requerimentos e informar o que está errado ao usuário.

  • Dyeison

    Jefferson, essa versão já dá pra usar normal, no Server 2003 e no Seven. Achei interessante de onde você está tirando a informação das unidades, “conversando” com o wmi. Pena que ele não fornece uma forma de diferenciar uma unidade real de uma virtual. Até no gerenciador, a virtual tem tudo normal, como a unidade real. Você conhece algum programa que consiga diferenciar a unidade real da virtual?

    • “Você conhece algum programa que consiga diferenciar a unidade real da virtual?”

      Eu acho que isso é impossível. Do contrário os programas de segurança dos jogos poderiam fazê-lo. Note que para burlar a detecção pelos jogos são usados vários artifícios, como randomizar o nome do driver e o “Friendly Name” do drive, justamente porque deve ser por esses nomes que os programas de segurança detectam a emulação. E é assim que estou fazendo para detectar.

  • Bem, agora mudou. O programa não causa a janela de erro e avisa que não detectou nenhuma unidade e que e provável que eu não tenha o serviço rodando.

    Mas o curioso é que o serviço WMI esta ativo e rodando.

    Olha só:

    Estes serviços do Windows NT foram iniciados:

    Agendador de tarefas
    Agente de diretiva IPSEC
    Alerta
    Apache2.2
    Armazenamento protegido
    Armazenamento removível
    Atualizações Automáticas
    Avira AntiVir Guard
    Avira AntiVir Scheduler
    Chama de procedimento remoto (RPC)
    Cliente de rastreamento de link distribuído
    Cliente DHCP
    Cliente DNS
    Conexões de rede
    DU Meter Service
    DynDNS Updater Service
    Estação de trabalho
    Extensões de driver de instrum. gerenc. do Windows
    Gerenciador de conexão de acesso remoto
    Gerenciador de contas de segurança
    Gerenciador de discos lógicos
    Gerenciamento de aplicativo
    InterBase Guardian
    InterBase Server
    Localizador de computadores
    Log de eventos
    Machine Debug Manager
    McAfee Desktop Firewall Service
    McAfee Framework Service
    MySQL
    NMSAccessU
    Notificação de eventos de sistema
    Plug and Play
    Serv-U FTP Server
    Servidor
    Serviço auxiliar NetBIOS TCP/IP
    Serviço de registro remoto
    Serviço RunAs
    Sistema de eventos do COM+
    Spooler de impressão
    Still Image Service
    Telefonia
    Testador de instrumentação de gerenciamento do Windows
    User Profile Hive Cleanup
    VNC Server

    Comando concluído com êxito.

    Vou testar em um VM com um windows 2000 SP4 puro, sem nada instalado… vamos ver. Funciona. Vamos testar também em meu notebook que roda o mesmo windows instalado no desktop (mesmas customizações e a partir do mesmo CD). Também funciona.

    Não sei dizer o que é o problema.

    • Luciano,

      Crie um arquivo .vbs com o seguinte conteúdo:

      On Error Resume Next
      strComputer = "."
      Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
      Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive")
      For Each objItem in colItems
      Wscript.Echo "Caption: " & objItem.Caption
      Wscript.Echo "Description: " & objItem.Description
      Wscript.Echo "Device ID: " & objItem.DeviceID
      Wscript.Echo "Drive: " & objItem.Drive
      Wscript.Echo "Manufacturer: " & objItem.Manufacturer
      Wscript.Echo "Media Loaded: " & objItem.MediaLoaded
      Wscript.Echo "Media Type: " & objItem.MediaType
      Wscript.Echo "Name: " & objItem.Name
      Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID
      Next

      Abra um prompt e execute-o. Copie e cole aqui o resultado.

  • Jefferson, teste, não retorna resultado algum.

    E:\>type test.vbs
    On Error Resume Next
    strComputer = “.”
    Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
    Set colItems = objWMIService.ExecQuery(“Select * from Win32_CDROMDrive”)
    For Each objItem in colItems
    Wscript.Echo “Caption: ” & objItem.Caption
    Wscript.Echo “Description: ” & objItem.Description
    Wscript.Echo “Device ID: ” & objItem.DeviceID
    Wscript.Echo “Drive: ” & objItem.Drive
    Wscript.Echo “Manufacturer: ” & objItem.Manufacturer
    Wscript.Echo “Media Loaded: ” & objItem.MediaLoaded
    Wscript.Echo “Media Type: ” & objItem.MediaType
    Wscript.Echo “Name: ” & objItem.Name
    Wscript.Echo “PNP Device ID: ” & objItem.PNPDeviceID
    Next
    E:\>
    E:\>test.vbs

    E:\>

  • Complementando… forcei a barra pelo cscript, mesmo resultado.

    e:\>cscript test.vbs
    Microsoft (R) Windows Script Host Versão 5.6
    Copyright (C) 1996-2001 Microsoft Corporation. Todos os direitos reservados.

    e:\>

  • Isso esta estranho…

    O teste do site pcpitstop diz que esta tudo ok:

    “The PC Pitstop WMI check succeeded; no problems were found.”

    O teste no gerenciamento do computador, quando mando conectar ao WMI esta ok também:

    Conectado com êxito a:

    Processador: Dual Core AMD Opteron(tm) Processor 170
    Sistema operacional: Microsoft Windows 2000 Professional
    Versão do sistema operacional: 5.0.2195
    Versão WMI: 1085.0005
    Local WMI: C:\WINNT\system32\WBEM

    Já o site http://www.djkaty.com/wmicorruption não abre aqui nem com bomba! Fica infinitamente em loading…

  • wilcker

    Cara parabens pela ideia eu ja tinha procurado um programa assim não tinha achado, muito obrigado.

Leave a Reply to Jefferson Cancel reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>