Abrindo e Fechando Gaveta do CD-ROM

23 respostas
A

[size=14] Usei JNA - Java Native Access - é uma biblioteca muito mais fácil e produtiva do que a JNI…[/size]

[size=14] O Link para ta baixando o JNA http://www.java2s.com/Code/Jar/j/Downloadjna330jar.htm[/size]

[size=14]Fiz um exemplo bem simples … mesmo … [/size]

import com.sun.jna.win32.StdCallLibrary;

public interface Winmm extends StdCallLibrary {
	
	void mciSendStringA(String command, int returnValue, int returnLength, int winHandle);

}
import java.util.InputMismatchException;
import java.util.Scanner;
import com.sun.jna.Native;

public class WinmmTeste {
	
	static int op;
	
	public static void main(String[] args){			
				
		Winmm openClose = (Winmm) Native.loadLibrary("winmm.dll", Winmm.class);		
		Scanner sc = new Scanner(System.in);	
			
			do{
				
				System.out.println("Para Abrir Gaveta (1) - Para Fechar Gaveta (2)");				
			    System.out.print("Opção: ");
			    
			    try{
				     op = sc.nextInt();				
				
			      }catch(InputMismatchException e){  
					
					  System.out.println("\nCaracteres não são Validos - Fim do Programa");
					  System.exit(1);
			        }				
				
				switch(op){
				
				case 1: 
					    openClose.mciSendStringA("Set cdaudio door open wait", 0, 0, 0);
		    	        System.out.println("\nGaveta Aberta...");
			            break;
			        
				case 2:
			            openClose.mciSendStringA("Set cdaudio door closed wait", 0, 0, 0);
		    	        System.out.println("\nGaveta Fechada...");
		                break;
		            
		        default:
		    	        break;		            
		       }	
				
				System.out.println();
		    
		   }while(op < 1 || op > 2); 			
			
	}
}

[size=14]Aqui funcionou blz… no WinXP vou fazer o teste no Win7… [/size]

23 Respostas

jeanmalvessi

Testou ? Fiz aqui no XP também!

Rodrigo_Vieira_Pinto

Página do projeto:

Yago_Ernandes

Testei no windows 7 e em um notebook e funcionou tambem… Pena que o comando de fechar não funcionou =D

jeanmalvessi

Pra mim funcionou o fechar!

E

O comando de fechar não vai funcionar em um notebook porque você precisa empurrar a gavetinha de qualquer jeito. “Parece que não sei…”

O comando de abrir, em um notebook, apenas solta a trava da gavetinha. Se você já olhou como funciona um drive de DVD de notebook, vai ver que a gavetinha abre por uma mola, não com um motorzinho (como é o caso de um desktop com aqueles leitores grandes de DVD. Mesmo desktops que têm aqueles leitores de DVD pequenos não conseguem fechar a gavetinha sozinhos. )

Se você usar um daqueles programas de copiar CDs, que fazem a verificação depois da gravação, vai ver que eles pedem para você empurrar a gavetinha porque não é possível recolher a gavetinha automaticamente.

criador

Fala gurizada…

Esta dando a seguinte exceção quando rodo o código:

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to com.sun.jna.Library
	at com.sun.jna.Native.loadLibrary(Native.java:396)
	at com.sun.jna.Native.loadLibrary(Native.java:378)
	at WinmmTeste.main(WinmmTeste.java:28)
criador

Esqueçam o erro que coloquei acima.

Faltava o “extends StdCallLibrary” na interface.

Abraço!

G

e o “Write once, run anywhere”?

como fica?

ou será q só uma farsa?

tô perguntando pq o marketing encima dessa frase é mt forte.
ai vejo uma simples abertura de uma bandeja de cdrom trepudiando encima do “anywhere” desse jeito.

E

GilsonNunes:
e o “Write once, run anywhere”?

como fica?

ou será q só uma farsa?

tô perguntando pq o marketing encima dessa frase é mt forte.
ai vejo uma simples abertura de uma bandeja de cdrom trepudiando encima do “anywhere” desse jeito.

Fora o fato que as palavras são “em cima” e “tripudiando”, o “Write once, run anywhere” é realmente apenas uma declaração de intenções. Na verdade o mais correto é “write once, test anywhere” :slight_smile:

G

entanglement:
GilsonNunes:
e o “Write once, run anywhere”?

como fica?

ou será q só uma farsa?

tô perguntando pq o marketing encima dessa frase é mt forte.
ai vejo uma simples abertura de uma bandeja de cdrom trepudiando encima do “anywhere” desse jeito.

Fora o fato que as palavras são “em cima” e “tripudiando”, o “Write once, run anywhere” é realmente apenas uma declaração de intenções. Na verdade o mais correto é “write once, test anywhere” :slight_smile:

foi mal.

na realidade é q tinha pensado na frase:

A prática encima a tese da inverdade que é o “run anywhere”.

ia me esquecendo.
é q me deixei levar pela palavra embaixo, e me atentei simplemente ao fato de M só ante de P e B

E

A língua portuguesa é muito complicada e cheia de regrinhas esquisitas.

Pelo menos é mais fácil que a língua japonesa, onde se você vê um nome de pessoa escrito em caracteres chineses (“kanji”), tem de perguntar para a pessoa que é dona desse nome qual é a pronúncia - um simples caracter muito básico, “明”, que está nas cartilhas do curso primário, pode indicar um nome de mulher “Akari” ou “Mei” ou um nome de homem “Akira”.

J


e o “Write once, run anywhere”?

como fica?

ou será q só uma farsa?

tô perguntando pq o marketing encima dessa frase é mt forte.
ai vejo uma simples abertura de uma bandeja de cdrom trepudiando encima do “anywhere” desse jeito.

Quando se pensa em multi-plataforma (que é diferente de portabilidade), não é recomendado este tipo de solução…
Dependendo da sua necessidade, se há muita integração com o SO, talvez Java não seja a tecnologia ideal para este desenvolvimento.

Lembre-se: se você só tem um martelo, todo parafuso vira prego!

A

jmmenezes:

e o “Write once, run anywhere”?

como fica?

ou será q só uma farsa?

tô perguntando pq o marketing encima dessa frase é mt forte.
ai vejo uma simples abertura de uma bandeja de cdrom trepudiando encima do “anywhere” desse jeito.

Quando se pensa em multi-plataforma (que é diferente de portabilidade), não é recomendado este tipo de solução…
Dependendo da sua necessidade, se há muita integração com o SO, talvez Java não seja a tecnologia ideal para este desenvolvimento.

Lembre-se: se você só tem um martelo, todo parafuso vira prego!

[size=14] Hum…se o Java é o Martelo então JNA e JNI são os parafusos…rsrs… que coisa… [/size]
[size=14] Tirando JNA e JNI …outra maneira de fazer seria criando um VBScript e executando o mesmo[/size]
[size=14] pelo Runtime.getRuntime().exec() , mas enfim…[/size]

[size=14]Foi apenas um pequeno exemplo como se trabalhar com JNA…[/size]

Albert Einstein: A mente que se abre a uma nova idéia jamais voltará ao seu tamanho original.

E

Eu tenho um programa gigantesco em Swing que precisa apenas de algumas coisas que são dependentes de plataforma.
No meu caso, simplesmente isolo essas coisas em um conjunto de classes - se eu conseguir implementar, é claro - , e aviso o usuário que certas coisas não vão funcionar em determinadas plataformas.

J

entanglement:
Eu tenho um programa gigantesco em Swing que precisa apenas de algumas coisas que são dependentes de plataforma.
No meu caso, simplesmente isolo essas coisas em um conjunto de classes - se eu conseguir implementar, é claro - , e aviso o usuário que certas coisas não vão funcionar em determinadas plataformas.

Exato… eu já fiz a mesma coisa quando precisei gravar algumas configurações no registry… fiz uma factory e dependendo da plataforma gravava em lugares diferentes… no caso do windows era Registry… era um requisito (urgh) do sistema!

Por isso disse… talvez o java não seja a tecnologia ideal… talvez…

O exemplo foi bem valido… foi apenas um comentário ao write once…

E

Casualmente o tal do programa gigante rodou em MacOSX, Linux e Windows sem precisar fazer muito esforço. Imagine se fosse em outra linguagem :frowning:

Yago_Ernandes

O comando de fechar não vai funcionar em um notebook porque você precisa empurrar a gavetinha de qualquer jeito. “Parece que não sei…”

O comando de abrir, em um notebook, apenas solta a trava da gavetinha. Se você já olhou como funciona um drive de DVD de notebook, vai ver que a gavetinha abre por uma mola, não com um motorzinho (como é o caso de um desktop com aqueles leitores grandes de DVD. Mesmo desktops que têm aqueles leitores de DVD pequenos não conseguem fechar a gavetinha sozinhos. )

Se você usar um daqueles programas de copiar CDs, que fazem a verificação depois da gravação, vai ver que eles pedem para você empurrar a gavetinha porque não é possível recolher a gavetinha automaticamente.

Eu to ligado… falei com tom irônico mesmo…

G

fosse em outra linguagem, teria rodado tb.
acrescentaria na lista o WinCE, e mais alguns q ainda não testei.

e td isso sem dependencia.

É o “write once, compile for anywhere”

nel

fosse em outra linguagem, teria rodado tb.
acrescentaria na lista o WinCE, e mais alguns q ainda não testei.

e td isso sem dependencia.

É o “write once, compile for anywhere”

Então tu me diz que um dot net e um C# da vida, por exemplo, rodariam facilmente nos três SO´s ?

G

que relação tem a palavra “compile” com essas linguagens supra citadas?
rsrs. to brincando.

mas falando sério, as linguagens no caso seria, c++, pascal, etc.
vc tem um COMPILADOR q gera binários para as plataformas alvos a partir de um único fonte.
na hora de compilar vc só escolhe o SO alvo e o widgetset e pronto

nel

GilsonNunes:
que relação tem a palavra “compile” com essas linguagens supra citadas?
rsrs. to brincando.

mas falando sério, as linguagens no caso seria, c++, pascal, etc.
vc tem um COMPILADOR q gera binários para as plataformas alvos a partir de um único fonte.
na hora de compilar vc só escolhe o SO alvo e o widgetset e pronto

É que disse linguagens, achei muito genérico.
E escolhe o SO em outras linguagens, no Java isso não existe (supondo que saiba o que está fazendo).
É claro que tem suas limitações como qualquer outra linguagem, mas ainda considero uma excelente linguagem multiplataforma.

FelipeWM

Executei o código mas está dando o erro abaixo:

java.lang.UnsatisfiedLinkError: Error looking up function 'mciSendString': Não foi possível encontrar o procedimento especificado.


	at com.sun.jna.Function.<init>(Function.java:179)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:430)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:410)
	at com.sun.jna.Library$Handler.invoke(Library.java:205)
	at $Proxy0.mciSendString(Unknown Source)
	at cdrom.WinmmTeste.main(WinmmTeste.java:29)
FelipeWM

Executei porém gerou o erro abaixo:

java.lang.UnsatisfiedLinkError: Error looking up function 'mciSendString': Não foi possível encontrar o procedimento especificado.


	at com.sun.jna.Function.<init>(Function.java:179)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:430)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:410)
	at com.sun.jna.Library$Handler.invoke(Library.java:205)
	at $Proxy0.mciSendString(Unknown Source)
	at cdrom.WinmmTeste.main(WinmmTeste.java:29)
Criado 6 de julho de 2012
Ultima resposta 12 de jun. de 2013
Respostas 23
Participantes 10