Ключ реестра, содержащий папку «Программы» локального пользователя в Vista.

StackOverflow https://stackoverflow.com/questions/57855

  •  09-06-2019
  •  | 
  •  

Вопрос

Я устраняю проблему с созданием ярлыков Vista.

Я хочу убедиться, что наш установщик читает папку «Программы» из правильного раздела реестра.

Он читает это из:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Programs

И он показывает этот каталог для программ:

C:\Users\NonAdmin2 UAC OFF\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

Судя по тому, что я прочитал, это кажется правильным, но я хотел еще раз проверить.

Это было полезно?

Решение

используйте свойства установщика Windows.наверное, будет проще.

http://msdn.microsoft.com/en-us/library/aa370905(VS.85).aspx#system_folder_properties

Другие советы

Не используйте реестр, чтобы прочитать это.Использовать SHGetFolderPath с CSIDL_PROGRAMS.

По какой причине см. комментарии Раймонда Чена к ключу «Shell Folders»:

http://blogs.msdn.com/oldnewthing/archive/2003/11/03/55532.aspx

Вероятно, вам следует использовать для этого API, например SHGetFolderPath

Для меня это звучит правильно.

Пример SHGetFolderPath в VBhttp://support.microsoft.com/kb/252652

Полезный фрагмент кода:

public class Utilities
{

    public enum FolderPaths
    {
        CSIDL_DESKTOP                   = 0x0000,        // <desktop>
        CSIDL_INTERNET                  = 0x0001,        // Internet Explorer (icon on desktop)
        CSIDL_PROGRAMS                  = 0x0002,        // Start Menu\Programs
        CSIDL_CONTROLS                  = 0x0003,        // My Computer\Control Panel
        CSIDL_PRINTERS                  = 0x0004,        // My Computer\Printers
        CSIDL_PERSONAL                  = 0x0005,        // My Documents
        CSIDL_FAVORITES                 = 0x0006,        // <user name>\Favorites
        CSIDL_STARTUP                   = 0x0007,        // Start Menu\Programs\Startup
        CSIDL_RECENT                    = 0x0008,        // <user name>\Recent
        CSIDL_SENDTO                    = 0x0009,        // <user name>\SendTo
        CSIDL_BITBUCKET                 = 0x000a,        // <desktop>\Recycle Bin
        CSIDL_STARTMENU                 = 0x000b,        // <user name>\Start Menu
        CSIDL_MYDOCUMENTS               = CSIDL_PERSONAL, //  Personal was just a silly name for My Documents
        CSIDL_MYMUSIC                   = 0x000d,        // "My Music" folder
        CSIDL_MYVIDEO                   = 0x000e,        // "My Videos" folder
        CSIDL_DESKTOPDIRECTORY          = 0x0010,        // <user name>\Desktop
        CSIDL_DRIVES                    = 0x0011,        // My Computer
        CSIDL_NETWORK                   = 0x0012,        // Network Neighborhood (My Network Places)
        CSIDL_NETHOOD                   = 0x0013,        // <user name>\nethood
        CSIDL_FONTS                     = 0x0014,        // windows\fonts
        CSIDL_TEMPLATES                 = 0x0015,
        CSIDL_COMMON_STARTMENU          = 0x0016,        // All Users\Start Menu
        CSIDL_COMMON_PROGRAMS           = 0X0017,        // All Users\Start Menu\Programs
        CSIDL_COMMON_STARTUP            = 0x0018,        // All Users\Startup
        CSIDL_COMMON_DESKTOPDIRECTORY   = 0x0019,        // All Users\Desktop
        CSIDL_APPDATA                   = 0x001a,        // <user name>\Application Data
        CSIDL_PRINTHOOD                 = 0x001b,        // <user name>\PrintHood
        CSIDL_LOCAL_APPDATA             = 0x001c        // <user name>\Local Settings\Applicaiton Data (non roaming)
    }


    [DllImport("shfolder.dll", CharSet = CharSet.Unicode)]
    public static extern int SHGetFolderPath(IntPtr owner, int folder, IntPtr token, int flags, StringBuilder path);
}

void MyFunction()
{
    StringBuilder path = new StringBuilder(260);

    String folderPath = "";
    if (0 == Utilities.SHGetFolderPath(IntPtr.Zero, (int) Utilities.FolderPaths.CSIDL_MYVIDEO, IntPtr.Zero, 0, path))
    {
        folderPath = path.ToString();
    }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top