2008-09-11 2 views
0

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

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

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

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

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

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

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

ответ

1

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

0

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

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(); 
    } 

}