[Aporte] EnvironEx

Iniciado por raul338, 18 Septiembre 2010, 01:43 AM

0 Miembros y 2 Visitantes están viendo este tema.

raul338

Hooola!

Resulta que estoy haciendo un programa que hace backups de cierta infomacion y necesitaba obtener (mediante Environ) algo asi:

En windows 7: C:\Users\<Usuario>\AppData\Local\
En windows XP: C:\Documents And Settings\<Usuario>\Configuracion Local\Datos de programa\

Para windows vista y adelante existe la variable de entorno "LocalAppData" pero para windows Xp no, y no encontre forma de hacerlo mediante Environ, hasta que buscando encontre un codigo en VBS, lo que facilmente lo pase a esta funcion:

Código (vb) [Seleccionar]

' Version original xD
Public Function GetLocalAppData() As String
   GetLocalAppData = CreateObject("Shell.Application").NameSpace(28).Self.Path
End Function


Funciona en windows 2000 en adelante :P

FUENTE original: http://www.winhelponline.com/blog/add-localappdata-environment-variable-in-windows-xp/ (Ver los comentarios)





EDIT! V2

Bueno, me pico la curiosidad y fui mas alla! jeje, deje el createObject y uso API ahora asi que bueno, hice esta pequeña Extension de Environ llamada "EnvironEx" que comparando resultados queda

Environ que te devuelve estos resulatdos
Citar
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\User\AppData\Roaming
CLASSPATH=.;C:\Program Files\Java\jre6\lib\ext\QTJava.zip
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=RAUL-PC
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\Raul
LOCALAPPDATA=C:\Users\User\AppData\Local
LOGONSERVER=\\RAUL-PC
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path=...................................
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 2, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0f02
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\User\AppData\Local\Temp
TMP=C:\Users\User\AppData\Local\Temp
USERDOMAIN=Raul-PC
USERNAME=User
USERPROFILE=C:\Users\User
windir=C:\Windows

Comparando con los comentarios que estan al lado de cada constante. Como veran, hay info que hay en uno que en otro no hay...
Código (vb) [Seleccionar]
Option Explicit
' Los resultados que tiro con windows 7
Public Enum CSIDL
   CSIDL_PROFILE = 40                      ' C:\Users\Raul
   CSIDL_PERSONAL = 5                      ' C:\Users\Raul\Documents
   CSIDL_DESKTOP = 0                       ' C:\Users\Raul\Desktop
   CSIDL_DESKTOPDIRECTORY = 16             ' C:\Users\Raul\Desktop
   CSIDL_FAVORITES = 6                     ' C:\Users\Raul\Favorites
   CSIDL_MYMUSIC = 13                      ' C:\Users\Raul\Music
   CSIDL_MYPICTURES = 39                   ' C:\Users\Raul\Pictures
   CSIDL_MYVIDEO = 14                      ' C:\Users\Raul\Videos
   CSIDL_LOCAL_APPDATA = 28                ' C:\Users\Raul\AppData\Local
   CSIDL_HISTORY = 34                      ' C:\Users\Raul\AppData\Local\Microsoft\Windows\History
   CSIDL_INTERNET_CACHE = 32               ' C:\Users\Raul\AppData\Local\Microsoft\Windows\Temporary Internet Files
   CSIDL_APPDATA = 26                      ' C:\Users\Raul\AppData\Roaming
   CSIDL_RECENT = 8                        ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Recent
   CSIDL_SENDTO = 9                        ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\SendTo
   CSIDL_TEMPLATES = 21                    ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Templates
   CSIDL_NETHOOD = 19                      ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Network Shortcuts
   CSIDL_PRINTHOOD = 27                    ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
   CSIDL_COOKIES = 33                      ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Cookies
   CSIDL_STARTMENU = 11                    ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Start Menu
   CSIDL_STARTUP = 7                       ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
   CSIDL_PROGRAMS = 2                      ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
   CSIDL_ADMINTOOLS = 48                   ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
   CSIDL_ALTSTARTUP = 29                   ' C:\Users\Raul\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
   CSIDL_CDBURN_AREA = 59                  ' C:\Users\Raul\AppData\Local\Microsoft\Windows\Burn\Burn
   CSIDL_COMMON_APPDATA = 35               ' C:\ProgramData
   CSIDL_COMMON_ADMINTOOLS = 47            ' C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
   CSIDL_COMMON_ALTSTARTUP = 30            ' C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
   CSIDL_COMMON_STARTMENU = 22             ' C:\ProgramData\Microsoft\Windows\Start Menu
   CSIDL_COMMON_PROGRAMS = 23              ' C:\ProgramData\Microsoft\Windows\Start Menu\Programs
   CSIDL_COMMON_STARTUP = 24               ' C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
   CSIDL_COMMON_TEMPLATES = 45             ' C:\ProgramData\Microsoft\Windows\Templates
   CSIDL_COMMON_OEM_LINKS = 58             ' C:\ProgramData\OEM Links
   CSIDL_COMMON_DESKTOPDIRECTORY = 25      ' C:\Users\Public\Desktop
   CSIDL_COMMON_DOCUMENTS = 46             ' C:\Users\Public\Documents
   CSIDL_COMMON_FAVORITES = 31             ' C:\Users\Raul\Favorites
   CSIDL_COMMON_MUSIC = 53                 ' C:\Users\Public\Music
   CSIDL_COMMON_PICTURES = 54              ' C:\Users\Public\Pictures
   CSIDL_COMMON_VIDEO = 55                 ' C:\Users\Public\Videos
   CSIDL_BITBUCKET = 10                    ' ???
   CSIDL_COMPUTERSNEARME = 61              ' ???
   CSIDL_CONNECTIONS = 49                  ' ???
   CSIDL_CONTROLS = 3                      ' ???
   CSIDL_DRIVES = 17                       ' ???
   CSIDL_INTERNET = 1                      ' ???
   CSIDL_MYDOCUMENTS = 12                  ' ???
   CSIDL_NETWORK = 18                      ' ???
   CSIDL_PRINTERS = 4                      ' ???
   CSIDL_FONTS = 20                        ' C:\Windows\Fonts
   CSIDL_PROGRAM_FILES = 38                ' C:\Program Files
   CSIDL_PROGRAM_FILESX86 = 42             ' C:\Program Files
   CSIDL_PROGRAM_FILES_COMMON = 43         ' C:\Program Files\Common Files
   CSIDL_PROGRAM_FILES_COMMONX86 = 44      ' C:\Program Files\Common Files
   CSIDL_RESOURCES = 56                    ' C:\Windows\resources
   CSIDL_RESOURCES_LOCALIZED = 57          ' C:\Windows\resources\0c0a
   CSIDL_SYSTEM = 37                       ' C:\Windows\system32
   CSIDL_SYSTEMX86 = 41                    ' C:\Windows\system32
   CSIDL_WINDOWS = 36                      ' C:\Windows
End Enum

Private Declare Function SHGetFolderPath Lib "shfolder" _
   Alias "SHGetFolderPathA" _
   (ByVal hwndOwner As Long, ByVal nFolder As Long, _
   ByVal hToken As Long, ByVal dwFlags As Long, _
   ByVal pszPath As String) As Long

Private Const MAX_PATH = 260

Public Function EnvironEx(nCode As CSIDL) As String
   Dim path As String * MAX_PATH
   Call SHGetFolderPath(&H0, nCode, 0, 0, path)
   EnvironEx = Replace$(Trim$(path), vbNullChar, vbNullString)
End Function



Y ahora si, es un aporte esto ya :xD (No descubri nada del otro mundo, simplemente lo comparto porque seguro hay quienes no sabian de la existencia de esto)

Psyke1


Petro_Boca


LeandroA

Cita de: Petro_Boca en 18 Septiembre 2010, 02:42 AM
y que hace la LocalAppData (?)

hace esto

Option Explicit

Private Sub Form_Load()
    MsgBox GetLocalAppData
End Sub

Public Function GetLocalAppData() As String
    GetLocalAppData = CreateObject("Shell.Application").NameSpace(28).Self.Path
End Function


BlackZeroX

#4
.
El CreateObject(), no lo tendrian que Descargar?... al rato hago algunas pruebas, por que me late que se queda en memoria...

Fue Paranoia mia.

Dulces Lunas!¡.
The Dark Shadow is my passion.

raul338


[D4N93R]


BlackZeroX

#7
.
El Hwnd no es tan nesesario como parametro..., tambien puedes crear una Ventana X con CreateWindowEX y tomar de hay el Hwnd devuelto y al ultimo destruirla... si es asi seria mejor con un Modulod e Clase para aprovechar los eventos Initialize y Terminate() de la clase

Código (vb) [Seleccionar]


Option Explicit

Public Enum CSIDL
   CSIDL_ADMINTOOLS = &H30
   CSIDL_ALTSTARTUP = &H1D
   CSIDL_APPDATA = &H1A
   CSIDL_BITBUCKET = &HA
   CSIDL_CDBURN_AREA = &H3B
   CSIDL_COMMON_ADMINTOOLS = &H2F
   CSIDL_COMMON_ALTSTARTUP = &H1E
   CSIDL_COMMON_APPDATA = &H23
   CSIDL_COMMON_DESKTOPDIRECTORY = &H19
   CSIDL_COMMON_DOCUMENTS = &H2E
   CSIDL_COMMON_FAVORITES = &H1F
   CSIDL_COMMON_MUSIC = &H35
   CSIDL_COMMON_OEM_LINKS = &H3A
   CSIDL_COMMON_PICTURES = &H36
   CSIDL_COMMON_PROGRAMS = &H17
   CSIDL_COMMON_STARTMENU = &H16
   CSIDL_COMMON_STARTUP = &H18
   CSIDL_COMMON_TEMPLATES = &H2D
   CSIDL_COMMON_VIDEO = &H37
   CSIDL_COMPUTERSNEARME = &H3D
   CSIDL_CONNECTIONS = &H31
   CSIDL_CONTROLS = &H3
   CSIDL_COOKIES = &H21
   CSIDL_DESKTOP = &H0
   CSIDL_DESKTOPDIRECTORY = &H10
   CSIDL_DRIVES = &H11
   CSIDL_FAVORITES = &H6
   CSIDL_FLAG_CREATE = &H8000
   CSIDL_FLAG_DONT_VERIFY = &H4000
   CSIDL_FLAG_MASK = &HFF00
   CSIDL_FLAG_NO_ALIAS = &H1000
   CSIDL_FLAG_PER_USER_INIT = &H800
   CSIDL_FONTS = &H14
   CSIDL_HISTORY = &H22
   CSIDL_INTERNET = &H1
   CSIDL_INTERNET_CACHE = &H20
   CSIDL_LOCAL_APPDATA = &H1C
   CSIDL_MYDOCUMENTS = &HC
   CSIDL_MYMUSIC = &HD
   CSIDL_MYPICTURES = &H27
   CSIDL_MYVIDEO = &HE
   CSIDL_NETHOOD = &H13
   CSIDL_NETWORK = &H12
   CSIDL_PERSONAL = &H5
   CSIDL_PRINTERS = &H4
   CSIDL_PRINTHOOD = &H1B
   CSIDL_PROFILE = &H28
   CSIDL_PROGRAM_FILES = &H26
   CSIDL_PROGRAM_FILES_COMMON = &H2B
   CSIDL_PROGRAM_FILES_COMMONX86 = &H2C
   CSIDL_PROGRAM_FILESX86 = &H2A
   CSIDL_PROGRAMS = &H2
   CSIDL_RECENT = &H8
   CSIDL_RESOURCES = &H38
   CSIDL_RESOURCES_LOCALIZED = &H39
   CSIDL_SENDTO = &H9
   CSIDL_STARTMENU = &HB
   CSIDL_STARTUP = &H7
   CSIDL_SYSTEM = &H25
   CSIDL_SYSTEMX86 = &H29
   CSIDL_TEMPLATES = &H15
   CSIDL_WINDOWS = &H24
End Enum

Private Declare Function SHGetFolderPath Lib "shfolder" _
   Alias "SHGetFolderPathA" _
   (ByVal hwndOwner As Long, ByVal nFolder As Long, _
   ByVal hToken As Long, ByVal dwFlags As Long, _
   ByVal pszPath As String) As Long
'   //  Private Const S_OK = &H0
'   //  Private Const S_FALSE = &H1
'   //  Private Const E_INVALIDARG = &H80070057

Private Const MAX_PATH = 260

Public Function EnvironEx(ByVal nCode As CSIDL) As String
Dim str_Return As String * MAX_PATH
   SHGetFolderPath &H0, nCode, &H0, &H0, str_Return$
   EnvironEx = Left$(str_Return$, InStr(1, str_Return$, Chr(0)) - 1)   '   //  Resto 1 para quitar el ultimo Chr(0).
End Function



Dulces Lunas!¡.
The Dark Shadow is my passion.

Dessa

Sí, pensé lo mismo del Hwnd, creo que tal vez tampoco las constantes para ver chequaer si existe, yá que el el retorno de la funcionl sería el str del Path o un vbnullstring. (correjime si me equivoco ya que la documentacion que encuentro está en Ingles y puedo tardar semanas en traducirla... XD)


Adrian Desanti

BlackZeroX

The Dark Shadow is my passion.