Ir al contenido


Foto

Obtener el nombre que el Shell da a una unidad de disco.


  • Por favor identifícate para responder
3 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 julio 2010 - 06:25

En ocasiones es necesario saber el nombre que Windows da a una unidad de disco. Conseguir el label de la unidad es fácil con la API GetVolumeInformation:
 


delphi
  1. var
  2.   Vol: array [0..256] of char;
  3.   T: DWORD;
  4. begin
  5.   GetVolumeInformation(PCHAR(Edit1.text), @Vol[0], 255, @T, T, T,0,0);
  6. end;


Pero sólo obtenemos la etiqueta, no el nombre que le da el explorador, por ejemplo al disco C:\ le suele llamar "SISTEMA (C:)".

Podemos reconstruir esa cadena a partir de la letra de unidad y la etiqueta o complicarnos un poco mas y pedirle al Shell, a través de IShellFolder Interface, que nos de el nombre específico. Para ello implementaremos una función como esta:
 


delphi
  1. uses shlobj;
  2.  
  3.  
  4. function GetDriveName(Drive: String): String;
  5. var
  6.   Desk: ISHELLFOLDER;
  7.   pidl: PITEMIDLIST;
  8.   StrRet: TSTRRET;
  9.  
  10. begin
  11.   Result:= '';
  12.   if SUCCEEDED(SHGetDesktopFolder(Desk)) then
  13.   begin
  14.       Desk.ParseDisplayName(0, nil, StringToOleStr(Drive), ULONG(nil^), pidl, ULONG(nil^));
  15.       Desk.GetDisplayNameOf(pidl, SHGDN_NORMAL, StrRet);
  16.       case StrRet.uType of
  17.         STRRET_WSTR:
  18.           Result:= StrRet.pOleStr;
  19.         STRRET_OFFSET:
  20.           Result:= PCHAR(pidl) + StrRet.uOffset;
  21.         STRRET_CSTR:
  22.           Result:= StrRet.cStr;
  23.       end;
  24.       Desk._Release();
  25.   end;
  26. end;


La usaremos así, por ejemplo:
 


delphi
  1. Label1.Caption:= GetDriveName('C:\');

 

Saludos.


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 julio 2010 - 06:28

Para los amantes del C/C++ podemos implementarla así usando Builder:



cpp
  1. #define NO_WIN32_LEAN_AND_MEAN
  2. #include <vcl.h>
  3. #pragma hdrstop
  4.  
  5. #include <shlobj.h>
  6.  
  7.  
  8. String GetDriveName(String Drive)
  9. {
  10.   LPSHELLFOLDER Desk;
  11.   LPITEMIDLIST  pidl;
  12.   STRRET        StrRet;
  13.   String        Result = "";
  14.  
  15.   if(SUCCEEDED(SHGetDesktopFolder(&Desk))){
  16.       Desk->ParseDisplayName(0, NULL, StringToOleStr(Drive), 0, &pidl, 0);
  17.       Desk->GetDisplayNameOf(pidl, SHGDN_NORMAL, &StrRet);
  18.       switch(StrRet.uType) {
  19.         case STRRET_WSTR:
  20.           Result = StrRet.pOleStr;
  21.           break;
  22.         case STRRET_OFFSET:
  23.           Result = (char*)pidl + StrRet.uOffset;
  24.           break;
  25.         case STRRET_CSTR:
  26.           Result = StrRet.cStr;
  27.           break;
  28.       }
  29.       Desk->Release();
  30.   }
  31.   return Result;
  32. }




La forma de uso sería así:



cpp
  1. String N = GetDriveName("D:\\");




Saludos..
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 15 julio 2010 - 07:26

Muchas gracias amigo, siempre publicando buen material y como nadie, en estereofónico :D (y)

Salud OS
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 julio 2010 - 08:19

Esa sí es una función muy útil, gracias compañero (y)
  • 0




IP.Board spam blocked by CleanTalk.