PDA

Ver la Versión Completa : Nombre de la Unidad activa


riqui73
13-07-2010, 19:04:02
Hola a todos, me gustaria saber como puedo obtener el nombre de la unidad activa que en mi caso sera un pendrive. Gracias de antemano.

delphi.com.ar
13-07-2010, 20:18:02
ExtractFileDrive(GetCurrentDir)


¿Esto?... o con nombre te refieres a la etiqueta del disco?

riqui73
13-07-2010, 21:48:16
Si,me refiero a la etiqueta. Imagina que es un pendrive que se llama kingston y aparece como unidad f: seria "f:\Kingston" pues quiero saber como se extrae "Kingston" de la unidad f:. Gracias.

escafandra
13-07-2010, 23:07:28
Prueba con esto:


char Vol[256]; // Aquí se obtendrá el nombre del volumen o etiqueta del disco.
GetVolumeInformation(ExtractFileDrive(GetCurrentDir()).c_str(), Vol, 255,0,0,0,0,0);


Saludos.

riqui73
13-07-2010, 23:15:05
me envia este error:

E2342 Type mismatch in parameter 'lpRootPathName' (wanted 'const char *', got 'wchar_t *')
E2034 Cannot convert 'wchar_t *' to 'const char *'

escafandra
14-07-2010, 00:38:32
¿Que compilador usas?, seguro que B2009 o superior.

Es un error del Unicode. Trata de cambiar c_str() por t_str():

char Vol[256]; // Aquí se obtendrá el nombre del volumen o etiqueta del disco.
GetVolumeInformation(ExtractFileDrive(GetCurrentDir()).t_str(), Vol, 255,0,0,0,0,0);

O de usar todo en Unicode:

wchar_t Vol[256]; // Aquí se obtendrá el nombre del volumen o etiqueta del disco. UNICODE WCHAR.
GetVolumeInformationW(ExtractFileDrive(GetCurrentDir()).c_str(), Vol, 255,0,0,0,0,0);

Saludos.

riqui73
14-07-2010, 08:19:07
Si, llevas razon, se trata de rad 2010. ya funciona sin errores. Infinitas gracias.
Saludos a todos.

riqui73
14-07-2010, 18:30:43
Bueno, pues no salgo de una cuando estoy en otra. Es cierto que funciona y que me da correctamente el nombre de la unidad, pero porque cuando hago una comparacion con un if no reconoce la exactitud del nombre.
Me explico:
Label1->caption = Vol (Se visualiza DOWNLOAKEY)

ahora if (Vol == "DOWNLOADKEY" ) no reconoce la igualdad.
¿a que se deberá esto?.Gracias.

escafandra
14-07-2010, 20:05:14
Sigue siendo un problema del unicode. Hazlo así:
if (Vol == L"DOWNLOADKEY" )
.....

o bien
if (Vol == TEXT("DOWNLOADKEY") )
.....

Saludos.

riqui73
14-07-2010, 21:38:55
Nada, no funciona asi, he tenido que hacer esto:

String NombreUnidad = Vol;

if (NombreUnidad == "DOWNLOADKEY" )
y ahora funciona pero no se si es lo adecuado.
Gracias

escafandra
14-07-2010, 22:13:53
Con las últimas versiones 2009 y 2010 se ha generado un lío tremendo con el tema del Unicode en las cadenas de texto. La VCL es compatible con Unicode pero no las clásicas funciones de C. Es preferible usar el tipo String que el AnsiString. L seguida de una cadena literal genera ese texto en unicode, así cono TEXT("Mi texto"). Las API terminadas en A son las clásicas no unicode, las terminadas en W trabajan en Unicode (que en el fondo siempre son llamadas por las anteriores)

Lamentablemente no trabajo con estas últimas versiones del Builder y por lo tanto no puedo realizar pruebas. Si tu código funciona, entonces es correcto. Te aconsejo que experimentes de distintas formas y que uses el debug para observar como son las cadenas de texto...

Las primeras versiones del B2009 tenían algún bug con el tema del unicode que se arregló mas tarde.

Saludos.

escafandra
15-07-2010, 14:49:33
Otra forma de implementar lo que buscas, es pedirle al shell que nos diga su nombre, a través de IShellFolder Interface (http://msdn.microsoft.com/en-us/library/bb775075%28VS.85%29.aspx):

#define NO_WIN32_LEAN_AND_MEAN
#include <vcl.h>
#pragma hdrstop

#include <shlobj.h>


String GetDriveName(String Drive)
{
LPSHELLFOLDER Desk;
LPITEMIDLIST pidl;
STRRET StrRet;
String Result = "";

if(SUCCEEDED(SHGetDesktopFolder(&Desk))){
Desk->ParseDisplayName(0, NULL, StringToOleStr(Drive), 0, &pidl, 0);
Desk->GetDisplayNameOf(pidl, SHGDN_NORMAL, &StrRet);
switch(StrRet.uType) {
case STRRET_WSTR:
Result = StrRet.pOleStr;
break;
case STRRET_OFFSET:
Result = (char*)pidl + StrRet.uOffset;
break;
case STRRET_CSTR:
Result = StrRet.cStr;
break;
}
Desk->Release();
}
return Result;
}Lo usaremos así:

String Name = GetDriveName("C:\\");
Saludos.