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:
' 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/ (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...
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)
Gracias, no lo sabia! :D
PD: Tu nueva firma da pena :-* :laugh:
DoEvents! :P
y que hace la LocalAppData (?)
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
.
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!¡.
Actualizado :P Con API!
Cita de: *PsYkE1* en 18 Septiembre 2010, 01:49 AM
PD: Tu nueva firma da pena :-* :laugh:
+1 xD Verdad raul, pon una firma vale xD
Ta bien el aporte!
.
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
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!¡.
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)
.
@Dessa
http://support.microsoft.com/kb/252652/es
Dulces Lunas!¡.
Gracias BlackZeroX , eso queria saber
Si no utiliza el indicador CSIDL_FLAG_CREATE:
si la carpeta no existe, la función de SHGetFolder devuelve S_FALSE y nada se coloca en el búfer de cadena.
.
Entonces quedo asi...
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!¡.
Yo la tenía parecida (siempre me olvido de los &H0 en lugar del 0, luego los cambio)
Una duda desde siempre, estária bien sRet o igual debe usarse MAX_PATH ?
Public Function ShEnviron(nCode As CSIDL) As String
Dim sRet As String * 260
Call SHGetFolderPath(0, nCode, 0, 0, sRet)
ShEnviron = Split(sRet, Chr$(0))(0)
End Function
.
MAX_PATH
La ruta maxima de windows es de 260 caracteres, si intentas meter una ruta mayor da error (Rutas de Archivos...), en la api no hay problema, pero como ya sabemos que el maximo que puede devolver es de 260 caracteres entonces no tiene caso aumentar el buffer, solo seria un gasto inesesario de memoria, ademas es una ruta de una carpeta donde seguro habra mas carpetas y archivos...
Dulces Lunas!¡.
Aclarado, entonces MAX_PATH.
si con este modulo quiero saber cual es C:\Windows\system32 , como tengo q hacer O.O?
creo que CSIDL_SYSTEM
http://msdn.microsoft.com/en-us/library/bb762494%28v=VS.85%29.aspx
Cita de: xkiz en 19 Septiembre 2010, 04:07 AM
creo que CSIDL_SYSTEM
http://msdn.microsoft.com/en-us/library/bb762494%28v=VS.85%29.aspx
sisi yase, pero me devuelve numeros :/
Option Explicit
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
Private Sub Form_Load()
Dim sRet As String * MAX_PATH
Call SHGetFolderPath(0, &H25, 0, 0, sRet)
MsgBox Split(sRet, Chr$(0))(0)
End Sub
Cita de: Dessa en 19 Septiembre 2010, 04:17 AM
Option Explicit
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
Private Sub Form_Load()
Dim sRet As String * MAX_PATH
Call SHGetFolderPath(0, &H25, 0, 0, sRet)
MsgBox Split(sRet, Chr$(0))(0)
End Sub
la variable seria el
&H25 ?
La constante pàra la carpeta de sistema seria &H25, lee la lista de Raul338 o el link de Xkis o todo el hilo ;)
Cita de: BlackZeroX
EnvironEx = Left$(str_Return$, InStr(1, str_Return$, Chr(0)) - 1) ' // Resto 1 para quitar el ultimo Chr(0).
Que eso no lo hace el Trim$ ? Lo de quitar el Chr(0) y lo que sigue ?
Lo de hacer una clase para esto seria algo exagerado, tal vez si incluimos otros metodos se aplicaria
Cita de: Dessa
Si no utiliza el indicador CSIDL_FLAG_CREATE:
si la carpeta no existe, la función de SHGetFolder devuelve S_FALSE y nada se coloca en el búfer de cadena.
Si.. habia leido eso, el problema es que nunca encontre las constantes de S_FALSE, E_FAIL y demas por lo que no los puse jeje
Cita de: Petro_Boca en 19 Septiembre 2010, 04:09 AM
Cita de: xkiz en 19 Septiembre 2010, 04:07 AM
creo que CSIDL_SYSTEM
http://msdn.microsoft.com/en-us/library/bb762494%28v=VS.85%29.aspx
sisi yase, pero me devuelve numeros :/
que raro que te devuelva numeros, generalmente eso pasa cuando pedis Internet (IE), Panel de control, red, impresoras, etc
.
Segun lo siguiente deviste haber usado RTrim$() en lugar de Trim$()
Aqui Todos los Trim()...
Function Trim$(String As String) As String
Miembro de VBA.Strings
Devuelve una copia de una cadena sin espacios iniciales y finales
Function Trim(String)
Miembro de VBA.Strings
Devuelve una copia de una cadena sin espacios iniciales y finales
Function RTrim$(String As String) As String
Miembro de VBA.Strings
Devuelve una copia de una cadena sin espacios finales
Function RTrim(String)
Miembro de VBA.Strings
Devuelve una copia de una cadena sin espacios finales
Function LTrim$(String As String) As String
Miembro de VBA.Strings
Devuelve una copia de una cadena sin los espacios iniciales
Function LTrim(String)
Miembro de VBA.Strings
Devuelve una copia de una cadena sin los espacios iniciales
* En Resumen solo quita los ESPACIOS no los Caracteres NULOS
Option Explicit
Private Sub Form_Load()
Dim Str_Data$
Dim Str_Aux$
Str_Data = Space$(200)
Mid$(Str_Data$, 1, 11) = "BlackZeroX" & Chr(0)
MsgBox Strings.Len(Str_Data$)
Str_Aux$ = Strings.Trim$(Str_Data$)
MsgBox "caracter Nulo = " & Conversion.CBool(InStr(1, Str_Aux$, Chr(0), vbBinaryCompare) > 0) & vbCr & Strings.Len(Str_Aux$) & vbCr & Str_Aux$ & Chr(34)
Str_Aux$ = Strings.Left$(Str_Data$, Strings.InStr(1, Str_Data$, Chr(0)) - 1)
MsgBox "caracter Nulo = " & Conversion.CBool(InStr(1, Str_Aux$, Chr(0), vbBinaryCompare) > 0) & vbCr & Strings.Len(Str_Aux$) & vbCr & Str_Aux$ & Chr(34)
End Sub
Dulce Infierno Lunar!¡.
.
Perdon no lei esto:
Cita de: raul338 en 19 Septiembre 2010, 05:26 AM
Lo de hacer una clase para esto seria algo exagerado, tal vez si incluimos otros metodos se aplicaria
Lo mensionaba para aprovechar el evento
initializze y asi crear una ventana con
CreateWindowExy el evento
finalize para destruir dicha ventana, así jalarias un
Hwnd VALIDO en su paramtro, aun que el
Hwnd de otra ventana como el del explorer (El escritorio) me parece que tambien sería valido, a
un mejor no nos complicamos y nos quedamos con &H0 te parece xP.
Dulces Lunas!¡.
Cita de: BlackZeroX en 19 Septiembre 2010, 06:04 AMun mejor no nos complicamos y nos quedamos con &H0 te parece xP.
Me parece la mejor opcion :xD