Как узнать путь к директории Program Files?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Как узнать путь к директории Program Files?

Сообщение |kerish| » 14.09.2005 (Ср) 12:58

Как узнать путь к директории Program Files?
Ведь на версиях Windows (испанская, немецкая, и др.) название у этой директории другое.
Как узнать путь к этой директории?

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 14.09.2005 (Ср) 13:01

Код: Выделить всё
Environ("ProgramFiles")

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 14.09.2005 (Ср) 14:53

Когда-то я писал установку, и мне повстречалась неожиданная проблема. Environ в Win9x не возвращает путь к ProgramFiles. Даже более того - API, и та не возвращает.

Пошел в обход.

Код: Выделить всё
'В форму

Option Explicit

Private Sub Form_Load()
    Debug.Print ReadCurrentVersion("ProgramFilesDir")
End Sub


'В модуль

Option Explicit

Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Public Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const REG_SZ = 1

Public Const STANDARD_RIGHTS_ALL As Long = &H1F0000
Public Const KEY_QUERY_VALUE As Long = &H1
Public Const KEY_SET_VALUE As Long = &H2
Public Const KEY_CREATE_SUB_KEY As Long = &H4
Public Const KEY_ENUMERATE_SUB_KEYS As Long = &H8
Public Const KEY_NOTIFY As Long = &H10
Public Const KEY_CREATE_LINK As Long = &H20
Public Const SYNCHRONIZE As Long = &H100000
Public Const KEY_ALL_ACCESS As Long = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))

Public Const RegCVPath9x = "SOFTWARE\Microsoft\Windows\CurrentVersion"
Public Const RegCVPathNT = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"

Public SA As SECURITY_ATTRIBUTES

Public Function ReadCurrentVersion(ByVal strRegKeyName As String) As String
    Dim Result As Long
    Dim lBuffSize As Long
    Dim UCVRegPath As String
    Dim intRetPos As Integer
    UCVRegPath = RegCVPath9x
Start:
    RegOpenKeyEx HKEY_LOCAL_MACHINE, UCVRegPath, 0, KEY_ALL_ACCESS, Result
    RegQueryValueEx Result, strRegKeyName, 0, 0, ByVal ReadCurrentVersion, lBuffSize
    If lBuffSize > 0 Then ReadCurrentVersion = Space$(lBuffSize)
    RegQueryValueEx Result, strRegKeyName, 0, 0, ByVal ReadCurrentVersion, Len(ReadCurrentVersion)
    RegCloseKey Result
    If ReadCurrentVersion = vbNullString And UCVRegPath <> RegCVPathNT Then
        UCVRegPath = RegCVPathNT
        GoTo Start:
    End If
    If ReadCurrentVersion = vbNullString Then Exit Function
    intRetPos = InStr(ReadCurrentVersion, vbNullChar)
    ReadCurrentVersion = Left$(ReadCurrentVersion, intRetPos - 1)
End Function
Последний раз редактировалось BV 15.09.2005 (Чт) 14:57, всего редактировалось 1 раз.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 14.09.2005 (Ср) 16:56

Gloom Я Environ-ом вообще не пользуюсь, постоянно слыша о его бажности.
BV Большое спасибо.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 15.09.2005 (Чт) 9:39

Код: Выделить всё
Private Declare Function SHGetFolderPath Lib "shell32.dll" Alias "SHGetFolderPathA" _
  (ByVal hwndOwner As Long, ByVal nFolder As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal pszPath As String) As Long

Const CSIDL_PROGRAM_FILES As Long = &H26

Private Sub Form_Load()
  Dim s As String, i As Long
  s = String(256, " ")
  i = SHGetFolderPath(0, CSIDL_PROGRAM_FILES, 0, 0, s)
  s = Left(s, InStr(s, vbNullChar) - 1)
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.09.2005 (Чт) 10:11

Vi, я точно не помню, но вроде бы Program Files понимает Shell только с определенной версии (которая в Win95OSR2). В Windows 95 его узнать можно только через реестр.
Lasciate ogni speranza, voi ch'entrate.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 15.09.2005 (Чт) 14:26

2 Vi

Я же написал, что и API не возвращает.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 31

    TopList