Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-07-2010
riqui73 riqui73 is offline
Registrado
 
Registrado: abr 2010
Posts: 8
Poder: 0
riqui73 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 13-07-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Código Delphi [-]
ExtractFileDrive(GetCurrentDir)

¿Esto?... o con nombre te refieres a la etiqueta del disco?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 13-07-2010
riqui73 riqui73 is offline
Registrado
 
Registrado: abr 2010
Posts: 8
Poder: 0
riqui73 Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 13-07-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #5  
Antiguo 13-07-2010
riqui73 riqui73 is offline
Registrado
 
Registrado: abr 2010
Posts: 8
Poder: 0
riqui73 Va por buen camino
me envia este error:

E2342 Type mismatch in parameter 'lpRootPathName' (wanted 'const char *', got 'wchar_t *')
E2034 Cannot convert 'wchar_t *' to 'const char *'
Responder Con Cita
  #6  
Antiguo 14-07-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
¿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.
Responder Con Cita
  #7  
Antiguo 14-07-2010
riqui73 riqui73 is offline
Registrado
 
Registrado: abr 2010
Posts: 8
Poder: 0
riqui73 Va por buen camino
Si, llevas razon, se trata de rad 2010. ya funciona sin errores. Infinitas gracias.
Saludos a todos.
Responder Con Cita
  #8  
Antiguo 14-07-2010
riqui73 riqui73 is offline
Registrado
 
Registrado: abr 2010
Posts: 8
Poder: 0
riqui73 Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 14-07-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Sigue siendo un problema del unicode. Hazlo así:
Código:
if (Vol == L"DOWNLOADKEY" )
   .....
o bien
Código:
if (Vol == TEXT("DOWNLOADKEY") )
   .....
Saludos.
Responder Con Cita
  #10  
Antiguo 14-07-2010
riqui73 riqui73 is offline
Registrado
 
Registrado: abr 2010
Posts: 8
Poder: 0
riqui73 Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 14-07-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #12  
Antiguo 15-07-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 15-07-2010 a las 15:13:48.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Detectar Nombre unidad donde se inserto CD JuanErasmo API de Windows 11 27-04-2007 22:09:20
Averiguar nombre de unidad para la sección uses akinom38 Varios 6 19-01-2006 17:26:02
Saber nombre de la unidad de CD rex Varios 2 18-08-2005 23:16:08
Cambiar el nombre de la unidad de DD? danytorres Varios 1 05-02-2004 07:07:58
Conocer el nombre de la aplicacion que se encuentra activa cso2000 Varios 4 24-10-2003 02:28:14


La franja horaria es GMT +2. Ahora son las 17:55:00.


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
Copyright 1996-2007 Club Delphi