Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Nombre de la Unidad activa (https://www.clubdelphi.com/foros/showthread.php?t=68896)

riqui73 13-07-2010 19:04:02

Nombre de la Unidad activa
 
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

Código Delphi [-]
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:

Código:

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():

Código:

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:

Código:

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í:
Código:

if (Vol == L"DOWNLOADKEY" )
  .....

o bien
Código:

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:

Código:

#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í:
Código:

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


La franja horaria es GMT +2. Ahora son las 16:31:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi