Newsgroup: it.comp.lang.visual-basic
Titolo: Directory dei Programmi?! ""Niubbo!!!""

Un Saluto a tutti da un dinosauro (che si nutre a Cobol).
Per diletto personale sto facendo un applicazione VB6 con molta fatica,
anche se il buon Googl e la diffusione del linguaggio mi ha aiutato molto.
Dopo questa premessa... vengo al sodo, con una domanda semplice semplice...
Come faccio a sapere come si chiama la directory usata di default da Windows
per installare i programmi?! Quella che normlmente si chiama c:\programmi
?!? :-((
Ho visto qualche post vecchio nonchè Google, trovando soluzioni per la Temp
ed altre Directory, ma non per questa.
Il problema nasce nel momento in cui voglio installare quest'applicazione,
tramite piccolo programmino d'installazione, sul pc di un mio amico spagnolo
che ovviamente ha Winzozz in lingua ispanica.
Vi ringrazio e chiedo scusa per il distrurbo e per l'eventuale ripetizione
di post
Saluti, Il (Dino)Sora!!


Da Google:
http://www.mvps.org/vbnet/index.html?code/browse/shpathidlist.htm
Non una ma due API, a scelta
L'esempio č in VB.net ma dovrebbe essere uguale.

 L'esempio č in VB.net ma dovrebbe essere uguale.
VbNet non e' VB.Net...

 L'esempio è in VB.net ma dovrebbe essere uguale.
Per una soluzione più "pulita" (senza andare a scomodare le funzioni di
internet explorer, che chissà anche se uno ce l'ha...), direttamente dal
progetto del Setup Wizard di VB:
Leggere la chiave di registro
HKLM
    SOFTWARE\Microsoft\Windows\CurrentVersion
        ProgramFilesDir
Per come fare a leggerla ti rimando ancora a google o al Sito Comune (vedi
firma)
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

> VbNet non e' VB.Net...
??
Mi sono perso qualche aggiornamento della M$?

 Mi sono perso qualche aggiornamento della M$?
No, mi sono perso la testa... quello era il nome del sito...
scusate.

 Leggere la chiave di registro
E se poi decidono di cambiarla? O di abolire il registro? ;-)

 E se poi decidono di cambiarla? O di abolire il registro? ;-)
Oppure se un'esplosione nucleare mandasse in pappa tutti i chip e ci
costringesse a smettere di lavorare e trasferirci su isole tropicali? :)
Comunque, se lo fa la Microsoft, in un progetto fatto in VB per VB, credo si
possa stare tranquilli.



Vero, mi ha ingannato il
lib "shell32"...

Vi ringrazio in un post comune per non intasare i Thread per le risposte
date..purtroppo ier sera son dovuto fuggire..... :-))
Stasera provo le soluzioni certo del loro funzionamento.. :-))) (Sperando
che una guerra intergalattica non mi bruci la ciabatta dove è attaccato il
PC. :-))
Grazie a tutti
Saluti, Il Sora!!
P.S. 'Na sera ho spulciato, nelle mie poche conoscenze, il
registro...l'avessi trovata sta chiave....:-((

 Saluti, Il (Dino)Sora!!
 
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 Grazie a tutti
 Di nulla ciao


 Quella che normlmente si chiama c:\programmi ?!? :-((
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
WScript.Echo _
 oShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\ProgramFilesDir")
--
Fosco


Perchč ?!! Avevi iniziato bene!
  oShell.SpecialFolders("Programs") '* E' meglio



  Mi sono accorto che la soluzione che ti ho postato, basata sul WSH non fa al
caso tuo, rimedio subito :
Const PROGRAM_FILES = &H26&
 Set objShell = CreateObject("Shell.Application")
 Set objFolder = objShell.Namespace(PROGRAM_FILES)
 Set objFolderItem = objFolder.Self
 Print objFolderItem.Path
Ciao


 Ciao
Ho provato le soluzioni postatemi, raggiungendo risultati molto simili fra
loro ma diversi dai miei desideri.. :-))
Con queste istruzioni mi sono avvicinato molto..penso.. ho cambiato la
costante H26 che non mi restituiva nulla con H17 che ho trovato in un elenco
di costanti su VBaccelerator:
CSIDL_COMMON_PROGRAMS = &H17          'All Users\Programs
questa mi restituisce in  "objFolder"  il valore "Programmi", ma
l'istruzione successiva non funziona... dice  che l?object non supporta il
metodo.
Io ho dichiarato le tre variabili tutte e tre Object...  non vorrei che
objFolderItem vada definito in altra maniera... fatto sta che non trovo la
maniera corretta... :-)))
Vi ringrazio per la pazienza..
Saluti, Il Sora!!

 Perchč ?!! Avevi iniziato bene!
Le tue "varie" soluzioni su certi SO non fungono
La mia "dovrebbe" funzionare indipendentemente
dal sistema operativo (windows) installato :-)
Una delle tue :
 Set oShell = WScript.CreateObject("WScript.Shell")
 WScript.Echo  oShell.SpecialFolders("Programs") '* E' meglio ???
a me Win98se italiano da':
C:\WINDOWS\Menu Avvio\Programmi
Tempo fa' avevo gia' fatto delle prove "scornadomicicicici" :
Option Explicit
Private Declare Function SHGetSpecialFolderLocation Lib "Shell32.DLL" (ByVal hWndOwner As Long, ByVal SHFolder As Long, idl As Long)
As Long
Private Declare Function SHGetPathFromIDList Lib "Shell32.DLL" (ByVal idl As Long, ByVal Path As String) As Long
Private Declare Function GetDesktopWindow Lib "User32.DLL" () As Long
Public Enum SystemFolder
  CSIDL_DESKTOP = 0
  CSIDL_PROGRAMS = 2
  CSIDL_CONTROLS = 3
  CSIDL_PRINTERS = 4
  CSIDL_PERSONAL = 5
  CSIDL_FAVORITES = 6
  CSIDL_STARTUP = 7
  CSIDL_BITBUCKET = 10
   CSIDL_COMMON_PROGRAMS = 23
    End Enum
Public Function SystemPath(ByVal PathID As SystemFolder) As String
Dim lngIDL As Long
Dim strBuff As String
strBuff = Space$(1024)
Dim n As Long
n = SHGetSpecialFolderLocation(GetDesktopWindow(), PathID, lngIDL)
If n Then Exit Function
n = SHGetPathFromIDList(lngIDL, strBuff)
If n > 0 Then
  n = InStr(strBuff, Chr$(0)) - 1
  strBuff = Left$(strBuff, n)
  If Right$(strBuff, 1) <> "\" Then strBuff = strBuff & "\"
  SystemPath = strBuff
  End If
End Function
Private Sub Form_Load()
MsgBox SystemPath(CSIDL_COMMON_PROGRAMS)
MsgBox SystemPath(2)
MsgBox SystemPath(23)
End Sub
--
Fosco

 dal sistema operativo (windows) installato :-)
   Vero!!!
Ciao



  mmm ma che sistama operativo hai ? Io ho provato su XP con VB6, forse il
suggerimento di "Fosco" č il piů vicino alle tue esigenze leggi qualche post
piů in alto e facci sapere.



  Prova questa provata su Win98SE Vb5 SP3:
Private Declare Function SHGetFolderPath Lib "shfolder.dll" Alias
"SHGetFolderPathA" _
  (ByVal hwndOwner As Long, ByVal nFolder As Long, _
  ByVal hToken As Long, ByVal dwReserved As Long, _
  ByVal lpszPath As String) As Long
Const CSIDL_PROGRAM_FILES = &H26
Const SHGFP_TYPE_CURRENT = 0
Dim NomeCartella as String ' Stringa che riceve il nome della cartella
Dim risultato as long ' riceve il risultato dell'operazione
Private Sub GetPath()
  NomeCartella=Space(259) 'Delimita lunghezza della stringa
  Risultato = shGetFolderPath (me.hWnd, CSIDL_PROGRAM_FILES, 0, _
              SHGFP_TYPE_CURRENT, NomeCartella) 'Legge la cartella
  If risultato <> &H0 then exit sub 'se errore, esce
  ' Ricava il nome della cartella:
 
  NomeCartella = rtrim(NomeCartella)
  ' Poiché l'ultimo carattere della stringa è NULL, va eliminato:
  NomeCartella = left(NomeCartella,len(NomeCartella)-1)
  ' Visualizza nella finestra Debug il nome della cartella
  Debug.Print NomeCartella
End Sub



Olиииииииии... Finalmente son riuscito, la Routine funziona.. и l'unica fra
quelle proposte che sul mio PC Win98E Italiano con VB6 ritorna
c:\programmi..
Ringrazio tutti per la collaborazione!!!
Appena riesco provo con l'amico spagnolo e vi faccio sapere... :))
Saluti, Il Sora!!

 Ringrazio tutti per la collaborazione!!!
 
  Di nulla caro.
Ciao
