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
Parabéns pela ideia! achei muito interessante, vou baixa para testar!!! Valeu pela iniciativa!!!
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. .
Eu vou checar o travamento assim que puder dar boot pelo Seven.
Quanto ao Daemon Tools, você está usando o YASU para randomizar os nomes de unidade, não é?
Acabo de testar no Seven e o problema é outro. O programa tem um bug relacionado com o numero de unidades que o faz travar. Ainda hoje eu devo ter uma versão com o problema corrigido.
Coloquei online a versão 0.2 do programa.
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.
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…
Era um bug. Do jeito que estava o programa só funcionava em uma máquina configurada do mesmo jeito que a minha. Teste a versão 0.2.1 por favor.
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.
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?
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:\>
O acesso a WMI está bichado nessa sua máquina. Nenhum programa que dependa de WMI vai funcionar aí.
Siga as instruções desta página:
http://www.djkaty.com/wmicorruption
Esta página pode ser esclarecedora também
http://www.pcpitstop.com/pcpitstop/FixWmi.asp
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…
A única coisa que dá para deduzir disso tudo é que por alguma razão o WMI não está enumerando a classe Win32_CDROMdrive no seu Windows.
o site http://www.djkaty.com/wmicorruption não abre aqui
Isso é outra coisa que merece estudo. Quando eu passei o link para você ontem eu estava na empresa de um cliente. Aqui em casa o danado também não está abrindo.
Cara parabens pela ideia eu ja tinha procurado um programa assim não tinha achado, muito obrigado.