PDA

Ver la Versión Completa : Detectar Nombre unidad donde se inserto CD


JuanErasmo
27-04-2007, 01:00:09
Hola amigos,
Necesito saber el nombre del drive donde se inserta un CD, es decir, el Drive,
porque segun eso le voy a dar una ruta a mi software para buscar un archivo....y como puede llamarse de tantas formas la unidad de CD ( F, G, H, etc...) , seria muy engorroso tener que preuntar la ruta cada vez que se inserta el CD...
Existe una manera de detectar el nombre de la unidad que se inserto?

Gracias!

jhonny
27-04-2007, 01:09:02
El truco 47 de Trucomania tiene el siguiente ejemplo, que sirve para saber de que tipo es una unidad:


function TipoDeDisco(RaizDisco: string): string;
var
i: word;
begin
i := GetDriveType(PChar(LowerCase(RaizDisco)));
case i of
{ Unknown }
0: result := 'no puedo determinarlo';
{ it doesn't exist }
1: result := 'no existe';
{ Floppy }
DRIVE_REMOVABLE: result := 'floppy/extraible';
{ Fixed }
DRIVE_FIXED: result := 'disco fijo';
{ Net unit }
DRIVE_REMOTE: result := 'unidad de red';
{ CD-ROM }
DRIVE_CDROM: result := 'cd-rom';
{ Ram Drive }
DRIVE_RAMDISK: result := 'disco-ram';
end;
end;


El llamado a esta función es, por ejemplo:


Label1.Caption:=TipoDeDisco('a:\');

Y la recomendación que hay mas abajo es la siguiente:


Podrias utilizarla también para buscar la unidad de CD-ROM del PC (pero cuidado, no basta con que
busques la primera que encuentres, podria haber más de una instalada).
Si tu aplicación extrae datos de un CD-ROM y necesitas saber si está insertado y en que unidad,
puedes primero buscar todas las unidades de tipo cd-rom, y, finalmente, buscar en todas ellas un
fichero determinado que sepas que existe en tu CD-ROM, así no habrá dudas.

Creo que ese truco se acopla a lo que necesitas. espero te sirva :).

jhonny
27-04-2007, 01:15:31
Ahora, también podrías usar el truco http://www.clubdelphi.com/trucos/index.php?id=386&scroll=0&scrollb=0 de nuestro amigo Domingo.

roman
27-04-2007, 05:27:22
Quizá pueda interesarte mi componente TCDChange (http://romansg.net/index.php?pg=cdchange) que detecta cuando se inserta o extrae un cd lanzando un evento


TCdChangeEvent = procedure(Sender: TObject; Drive: Char) of object;


que indica la letra de la unidad que se insertó o extrajo.

// Saludos

cHackAll
27-04-2007, 18:49:41
No pues Jhonny lo del amigo Domingo parece interesante... lo revisare pero no creo que sea aplicable al problema.

Al tema: lo que yo hice para piratearme algunas cosillas es lo siguiente.

La siguiente linea la debes poner (obviamente) dentro de la declaración de los métodos de la clase de tu formulario:

procedure DeviceChange(var Message: TMessage); message WM_DEVICECHANGE;


El siguiente código copialo dentro de la seccion de implementación de procedimientos. No olvides reemplazar (en caso de que tu formulario tenga otro), el nombre de la clase TForm1 por la que estes utilizando:

const
DBT_DEVICEARRIVAL = $8000; { system detected a new device }
DBT_DEVTYP_VOLUME = $00000002; { logical volume }

type
PDevBroadcastVolume = ^TDevBroadcastVolume;
TDevBroadcastVolume = packed record
dbcv_size: Cardinal;
dbcv_devicetype: Cardinal;
dbcv_reserved: Cardinal;
dbcv_unitmask: Cardinal;
dbcv_flags: Word;
end;

procedure TForm1.DeviceChange(var Message: TMessage);
var Drive: Char; UnitMask: Cardinal;
begin
with Message do
if wParam = DBT_DEVICEARRIVAL then
with PDevBroadcastVolume(lParam)^ do
if (dbcv_devicetype = DBT_DEVTYP_VOLUME) and (dbcv_flags = 1) then // Si quieres darle a una EEPROM cambia a "(dbcv_flags = 0)"
begin
Drive := '@' ('@');
UnitMask := dbcv_unitmask; //
repeat Inc(Drive);
UnitMask := UnitMask shr 1;
until UnitMask = 0;
WinExec(PChar('cmd /kdir ' + Drive + ':'), 0); // 'Drive' is your business :)
end;
end;

Ahora si ésto no te funciona y luego de haber analizado otras alternativas, pues usaría algo del código que te dieron antes:

for Drive := 'b' to 'z' do
if GetDriveType(PChar(Drive + ':\')) = DRIVE_CDROM then
begin
WinExec(PChar('cmd /kdir ' + Drive + ':'), 0);
Break;
end

Bueno te dí la forma correcta y un kludges que necesita algunos arreglos pues solo te sirve para saber que unidades son CD/DVD, ahora debes ver si tiene lo que buscas, si ya lo revisaste, etc., pero espero que el primero solucione tu inquitud.

Suerte

PD: Este tema esta death? por que me aparecen participaciones de mayo del 2003 y en la raíz dice que fue hace agunas horas? moderadores, GüebMosters can any one help me?

egostar
27-04-2007, 19:00:31
PD: Este tema esta death? por que me aparecen participaciones de mayo del 2003 y en la raíz dice que fue hace agunas horas? moderadores, GüebMosters can any one help me?

Bueno, curiosamente johnny y roman se registraron en el foro en Mayo del 2003

jhonny
Fecha de Ingreso: May 2003
Localización: Cali (pachanguero turututu tutu)-Colombia
Mensajes: 1.387

roman
Fecha de Ingreso: May 2003
Localización: Ciudad de México
Mensajes: 10.761

Salud OS.

Edito: Este hilo fue creado hace 17 horas.

jhonny
27-04-2007, 19:06:58
No pues Jhonny lo del amigo Domingo parece interesante... lo revisare pero no creo que sea aplicable al problema.

Lo de Domingo si sirve porque te permite saber cual de las unidades son un CDROM, o un CDRW, o cualquiera de esos solo con preguntarle A, B, C, D, E, F... O cualquiera de esas letras, una ves capturada esa información podríamos averiguar en cual de esos esta el CD que necesitamos.

Ahora bien, El componente de roman me parece mas apropiado para este problema, pues simplifica la labor.

En cuanto a lo del hilo pues te cuento que no esta muerto, lo de la participación de Mayo 2003 no se donde lo haz visto porque yo lo veo bien.

jhonny
27-04-2007, 19:09:50
Bueno, curiosamente johnny y roman se registraron en el foro en Mayo del 2003

Ahhh, ya entendí que es lo que nuestro amigo esta viendo :D, no es ni tan curioso, lo que sucede es que cuando se hizo el cambio de foros todos corrimos a registrarnos de nuevo antes de que otra persona ocupara nuestro nick :D.

seoane
27-04-2007, 19:15:53
No pues Jhonny lo del amigo Domingo parece interesante... lo revisare pero no creo que sea aplicable al problema.

Ese no, pero este otro puede que si .... ;)
http://www.clubdelphi.com/foros/showpost.php?p=131896&postcount=2


Al tema: lo que yo hice para piratearme algunas cosillas es lo siguiente.

Eso suena interesante, detectabas la inserción del cd y ... :confused: Mi imaginación calenturienta me hace pensar que fisgabas en cds ajenos :D ;) Aunque ya de hacerlo, lo mejor es fisgar memorias usb, creando una imagen sector a sector, para luego poder revisar también los archivos borrados ... ;) Ojo, que yo nunca hice nada parecido !!! Eh!!! :D


...
procedure DeviceChange(var Message: TMessage); message WM_DEVICECHANGE;
...

Eso mismo, dentro de un componente y envuelto para regalo es lo que ofrece roman en su pagina.

cHackAll
27-04-2007, 19:45:34
Estoy leyendo mal entonces? por que mayo? o es que estoy viendo la fecha de registro y no de participacion?

Seoane: lo de roman puede ser, pero lo mio e la "escencia" que puede ser usado con EEPROMs tambien.

Lo otro en realidad si hice de los dos pero sin ventanas visibles ni nada de eso (VCL), detectaba lo insercion de una flash (EEPROM) y me lo copiaba sector por sector, el problema es que cuando hablamos de un Flash de 2Gb tarda (claro en segundo plano) y tarda mas cuando es una MP3 o MP4 pues labura como usb 1.1. Ademas el FAT16 no optimiza muy bien el orden de los datos que digamos, adicional a esto tenia que montarlo en una imagen para leer los datos y no me pareció del todo practico, asi que hice una copia de archivos normal... nunca lo use en CDs pues tampoco me parecio muy practico... quieren saber como hice mi pirateador flash? se los publicare proximamente.

roman
27-04-2007, 20:22:54
No pues, le voy a agregar el comentario


// Si quieres darle a una EEPROM cambia a "(dbcv_flags = 0)"


a mi componente para hacerlo la esencia.

:D

// Saludos

cHackAll
27-04-2007, 22:09:20
No entendi lo que quisiste decir, pero bueno pirateemos!