Programming/Windows API
SHGetSpecialFolderPath는 Windows운영체제의 여러가지 지정된 특수Folder의 경로를 조회하는 함수입니다.

<DllImport("shell32.dll")> _
Private Shared Function SHGetSpecialFolderPath(ByVal hwndOwner As IntPtr, <Out()> ByVal lpszPath As StringBuilder, ByVal nFolder As Integer, ByVal fCreate As Boolean) As Boolean
End Function
▶VB.NET 선언

[DllImport("shell32.dll")]
static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, [Out] StringBuilder lpszPath, int nFolder, bool fCreate);
▶C# 선언

SHGetSpecialFolderPath 함수의 첫번째 인수는 Pointer관련 형식으로 단순조회시에는 별다른 값을 필요로 하지 않으므로 Zero를 지정합니다.

두번째 인수는 찾고자 하는 Path를 문자열 형식으로 반환받을 변수를 지정하며 세번째 인수에 Windows의 어떠한 System Foler를 반환받을지 Type을 설정하도록 합니다. 세번째 인수로 지정할 수 있는 값은 다음과 같은것이 있으니 참고하시기 바랍니다. 이 인수들을 잘 활용하면 System의 거의 모든 특수Folder를 가져올 수 있으면 부분적으로나마 System정보도 가져올 수 있게 됩니다.

 VB.NET  C#  Path
 &H0  0x0000;  DESKTOP
 &H1  0x0001;  INTERNET
 &H2  0x0002;  PROGRAMS
 &H3  0x0003;  CONTROLS
 &H4  0x0004;  PRINTERS
 &H5  0x0005;  PERSONAL
 &H6  0x0006;  FAVORITES
 &H7  0x0007;  STARTUP
 &H8  0x0008;  RECENT
 &H9  0x0009;  SENDTO
 &Ha  0x000a;  BITBUCKET
 &Hb  0x000b;  STARTMENU
 &Hd  0x000d;  MYMUSIC
 &He  0x000e;  MYVIDEO
 &H10  0x0010;  DESKTOPDIRECTORY
 &H11  0x0011;  DRIVES
 &H12  0x0012;  NETWORK
 &H13  0x0013;  NETHOOD
 &H14  0x0014;  FONTS
 &H15  0x0015;  TEMPLATES
 &H16  0x0016;  COMMON STARTMENU
 &H17  0x0017;  COMMON PROGRAMS
 &H18  0x0018;  COMMON STARTUP
 &H19  0x0019;  COMMON DESKTOPDIRECTORY
 &H1a  0x001a;  APPDATA
 &H1b  0x001b;  PRINTHOOD
 &H1c  0x001c;  LOCAL APPDATA
 &H1d  0x001d;  ALTSTARTUP
 &H1e  0x001e;  COMMON ALTSTARTUP
 &H1f  0x001f;  COMMON FAVORITES
 &H20  0x0020;  INTERNET CACHE
 &H21  0x0021;  COOKIES
 &H22  0x0022;  HISTORY
 &H23  0x0023;  COMMON APPDATA
 &H24  0x0024;  WINDOWS
 &H25  0x0025;  SYSTEM
 &H26  0x0026;  PROGRAM FILES
 &H27  0x0027;  MYPICTURES
 &H28  0x0028;  PROFILE
 &H29  0x0029;  SYSTEMX86
 &H2a  0x002a;  PROGRAM FILESX86
 &H2b  0x002b;  PROGRAM FILES COMMON
 &H2c  0x002c;  PROGRAM FILES
 &H2d  0x002d;  COMMON TEMPLATES
 &H2e  0x002e;  COMMON DOCUMENTS
 &H2f  0x002f;  COMMON ADMINTOOLS
 &H30  0x0030;  ADMINTOOLS
 &H31  0x0031;  CONNECTIONS
 &H35  0x0035;  COMMON MUSIC
 &H36  0x0036;  COMMON PICTURES
 &H37  0x0037;  COMMON VIDEO
 &H38  0x0038;  RESOURCES
 &H39  0x0039;  RESOURCES LOCALIZED
 &H3a  0x003a;  COMMON OEM LINKS
 &H3b  0x003b;  CDBURN AREA
 &H3d  0x003d;  COMPUTERSNEARME
 &H8000  0x8000;  FLAG CREATE
 &H4000  0x4000;  FLAG DONT VERIFY
 &H2000  0x2000;  FLAG DONT UNEXPAND
 &H1000  0x1000;  FLAG NO ALIAS
 &H0800  0x0800;  CSIDL FLAG PER USER INIT

마지막 네번째 인수는 해당 Path를 조회할때 실제 Path가 존재하지 않으면 생성할지를 지정하는 부분입니다. 생성하고자 하면 True를 아니면 False로 값을 정합니다.

위 인수를 토대로 해당 Windows의 즐겨찾기가 저장된 Folder를 찾으려면 다음과 같이 할 수 있습니다.

Dim path As New StringBuilder(260)
SHGetSpecialFolderPath(IntPtr.Zero, path, &H6, False)
MessageBox.Show(path.ToString())
▶VB.NET

StringBuilder path = new StringBuilder(260);
SHGetSpecialFolderPath(IntPtr.Zero, path, 0x6, false);
MessageBox.Show(path.ToString());
▶C#
0 0