3 using System.Runtime.InteropServices;
\r
4 using System.Runtime.InteropServices.ComTypes;
\r
5 using System.Diagnostics;
\r
7 namespace NaGet.InteropServices
\r
10 /// ShellLink
\82Ì
\8dX
\90V
\83t
\83\89\83O
\r
13 public enum ShellLinkResolve : uint
\r
15 // AnyMatch = 0x02, // winMe,win2k
\88È
\8d~
\96³
\8cø
\r
22 ///
\92Ç
\90Õ
\8bÖ
\8e~
\r
26 ///
\83\8a\83\93\83N
\90æ
\82Ì
\89ð
\8c\88\82ª
\82Å
\82«
\82È
\82¢
\82Æ
\82«
\83_
\83C
\83A
\83\8d\83O
\82ð
\95\
\8e¦
\82µ
\82È
\82¢
\r
29 NoUiWithMsgPump = 0x101,
\r
31 ///
\83\8a\83\93\83N
\90æ
\82Ì
\83f
\81[
\83^
\8dX
\90V
\82ð
\8ds
\82í
\82È
\82¢
\r
35 ///
\8c\9f\8dõ
\82ð
\82µ
\82È
\82¢
\r
40 ///
\83\8a\83\93\83N
\90æ
\82ð
\8dX
\90V
\82·
\82é
\r
46 [Guid("000214F9-0000-0000-C000-000000000046")]
\r
47 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
\r
48 public interface IShellLinkW
\r
50 void GetPath([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile,
\r
51 int cchMaxPath, IntPtr pfd, uint fFlags);
\r
53 void GetIDList(out IntPtr ppidl);
\r
54 void SetIDList(IntPtr pidl);
\r
56 void GetDescription([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDesc,
\r
58 void SetDescription(string pszDesc);
\r
60 void GetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir,
\r
62 void SetWorkingDirectory(string pszDir);
\r
64 void GetArguments([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs,
\r
66 void SetArguments(string pszArgs);
\r
68 void GetHotkey(out short pwHotkey);
\r
69 void SetHotkey(short pwHotkey);
\r
71 void GetShowCmd(out uint piShowCmd);
\r
72 void SetShowCmd(uint piShowCmd);
\r
74 void GetIconLocation([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,
\r
75 int cchMaxPath, out int piIcon);
\r
76 void SetIconLocation(string pszIconPath, int iIcon);
\r
78 void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszPath,
\r
79 int cchMaxPath, uint dwReserved);
\r
81 void Resolve(IntPtr hWnd, ShellLinkResolve fFlag);
\r
83 void SetPath(string pszFile);
\r
87 ///
\83V
\83F
\83\8b\83\8a\83\93\83N(
\83V
\83\87\81[
\83g
\83J
\83b
\83g)
\82Ì
\83J
\83v
\83Z
\83\8b\83N
\83\89\83X
\r
89 public class ShellLink : IDisposable
\r
92 ///
\83V
\83F
\83\8b\83\8a\83\93\83N
\82ÌCOM
\83I
\83u
\83W
\83F
\83N
\83g
\r
94 protected IShellLinkW shellLink;
\r
97 ///
\83V
\83F
\83\8b\83\8a\83\93\83N
\82ÌGUID
\r
99 public const string ShellLinkGuid = "00021401-0000-0000-C000-000000000046";
\r
101 protected const int MAX_PATH = 260;
\r
105 Type shellLinkType = Type.GetTypeFromCLSID(new Guid(ShellLinkGuid));
\r
106 shellLink = (IShellLinkW) Activator.CreateInstance(shellLinkType);
\r
109 public ShellLink(string path) : this()
\r
111 if (! System.IO.File.Exists(path)) {
\r
112 throw new System.IO.FileNotFoundException("File does not found", path);
\r
115 ToPersistFile().Load(path, 0);
\r
116 Resolve(IntPtr.Zero, ShellLinkResolve.NoUpdate | ShellLinkResolve.NoUi);
\r
120 ///
\83V
\83F
\83\8b\83\8a\83\93\83N
\82Ì
\89ð
\90Í
\89ð
\8c\88\r
122 /// <param name="hWnd">
\90e
\83t
\83\8c\81[
\83\80\82Ì
\83n
\83\93\83h
\83\8b</param>
\r
123 /// <param name="fFlags">
\95û
\96@</param>
\r
124 public void Resolve(IntPtr? hWnd, ShellLinkResolve fFlags)
\r
126 shellLink.Resolve(hWnd ?? IntPtr.Zero, fFlags);
\r
130 /// IPersistFile
\82Æ
\82µ
\82Ä
\8eæ
\82è
\8fo
\82·
\r
132 /// <returns>IPersistFile
\82É
\83L
\83\83\83X
\83g
\82³
\82ê
\82½COM
\83I
\83u
\83W
\83F
\83N
\83g</returns>
\r
133 public IPersistFile ToPersistFile()
\r
135 return (IPersistFile) shellLink;
\r
139 ///
\83\8a\83\93\83N
\90æ
\83p
\83X
\82ð
\93¾
\82é
\81B
\83R
\83}
\83\93\83h
\83\89\83C
\83\93\82ð
\93¾
\82é
\82½
\82ß
\82É
\82à
\r
141 /// <param name="fFlags">
\83p
\83X
\82Ì
\83^
\83C
\83v(1:8.3
\8c`
\8e®; 2:UNC
\83p
\83X; 4:
\8aÂ
\8b«
\95Ï
\90\94\95Ï
\8a·
\82È
\82µ)</param>
\r
142 /// <returns>
\83p
\83X</returns>
\r
143 public string GetPath(uint fFlags)
\r
145 StringBuilder sb = new StringBuilder(MAX_PATH);
\r
146 shellLink.GetPath(sb, sb.Capacity, IntPtr.Zero, fFlags);
\r
147 return sb.ToString();
\r
151 ///
\83\8a\83\93\83N
\90æ
\83p
\83X(
\8eæ
\93¾
\8e\9e\82É
\82Í
\8aÂ
\8b«
\95Ï
\90\94\82Í
\93W
\8aJ
\82³
\82ê
\82Ü
\82¹
\82ñ)
\r
153 public string Path {
\r
154 get { return GetPath(0x04); }
\r
155 set { shellLink.SetPath(value); }
\r
159 ///
\83\8a\83\93\83N
\90æ(
\88ø
\90\94)
\r
161 public string Arguments {
\r
163 StringBuilder sb = new StringBuilder(MAX_PATH);
\r
164 shellLink.GetArguments(sb, sb.Capacity);
\r
165 return sb.ToString();
\r
167 set { shellLink.SetArguments(value); }
\r
171 ///
\8dì
\8bÆ
\83t
\83H
\83\8b\83_
\r
173 public string WorkingDirectory {
\r
175 StringBuilder sb = new StringBuilder(MAX_PATH);
\r
176 shellLink.GetWorkingDirectory(sb, sb.Capacity);
\r
177 return sb.ToString();
\r
179 set { shellLink.SetWorkingDirectory(value); }
\r
183 ///
\83E
\83B
\83\93\83h
\83E
\83X
\83^
\83C
\83\8b(ShowCmd
\82Ì
\83\8f\83b
\83p)
\r
185 public ProcessWindowStyle WindowStyle
\r
189 shellLink.GetShowCmd(out showcmd);
\r
192 return ProcessWindowStyle.Maximized;
\r
194 return ProcessWindowStyle.Minimized;
\r
197 return ProcessWindowStyle.Normal;
\r
202 case ProcessWindowStyle.Normal:
\r
203 shellLink.SetShowCmd(1);
\r
205 case ProcessWindowStyle.Maximized:
\r
206 shellLink.SetShowCmd(3);
\r
208 case ProcessWindowStyle.Minimized:
\r
209 case ProcessWindowStyle.Hidden:
\r
210 shellLink.SetShowCmd(7);
\r
217 ///
\83A
\83C
\83R
\83\93\82Ì
\8fê
\8f\8a\82ð
\93¾
\82é
\r
219 /// <param name="iconPath">
\83A
\83C
\83R
\83\93\82ð
\8aÜ
\82Þ
\83t
\83@
\83C
\83\8b\83p
\83X</param>
\r
220 /// <param name="iconIndex">
\83A
\83C
\83R
\83\93\82Ì
\83C
\83\93\83f
\83b
\83N
\83X</param>
\r
221 public void GetIconLocation(out string iconPath, out int iconIndex)
\r
223 StringBuilder sb = new StringBuilder(MAX_PATH);
\r
224 shellLink.GetIconLocation(sb, sb.Capacity, out iconIndex);
\r
225 iconPath = sb.ToString();
\r
229 ///
\83A
\83C
\83R
\83\93\82Ì
\8fê
\8f\8a\82ð
\90Ý
\92è
\82·
\82é
\r
231 /// <param name="iconPath">
\83A
\83C
\83R
\83\93\82ð
\8aÜ
\82Þ
\83t
\83@
\83C
\83\8b\83p
\83X</param>
\r
232 /// <param name="iconIndex">
\83A
\83C
\83R
\83\93\82Ì
\83C
\83\93\83f
\83b
\83N
\83X</param>
\r
233 public void SetIconLocation(string iconPath, int iconIndex)
\r
235 shellLink.SetIconLocation(iconPath, iconIndex);
\r
239 /// COM
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\8aJ
\95ú
\r
241 public void Dispose()
\r
243 if (shellLink != null) {
\r
244 Marshal.ReleaseComObject(shellLink);
\r
250 ///
\83V
\83F
\83\8b\83\8a\83\93\83N
\82Ì
\92\86\90g
\82ð
\83v
\83\8d\83Z
\83X
\8fî
\95ñ
\82Æ
\82µ
\82Ä
\8eæ
\93¾
\82·
\82é
\81B
\8bN
\93®
\82Ì
\8dÛ
\82É
\97\98\97p
\r
252 /// <returns>
\83v
\83\8d\83Z
\83X
\8bN
\93®
\8fî
\95ñ
\89»
\82³
\82ê
\82½
\83V
\83F
\83\8b\83\8a\83\93\83N
\82Ì
\8fî
\95ñ</returns>
\r
253 public ProcessStartInfo ToProcessStartInfo()
\r
255 ProcessStartInfo procInfo = new ProcessStartInfo();
\r
256 procInfo.FileName = GetPath(0);
\r
257 procInfo.Arguments = Arguments;
\r
258 procInfo.WorkingDirectory = WorkingDirectory;
\r
259 procInfo.WindowStyle = WindowStyle;
\r
265 ///
\83v
\83\8d\83Z
\83X
\8fî
\95ñ
\82©
\82ç
\83V
\83F
\83\8b\83\8a\83\93\83N
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\90¶
\90¬
\r
267 /// <param name="procInfo">
\83v
\83\8d\83Z
\83X
\8fî
\95ñ</param>
\r
268 /// <returns>
\90¶
\90¬
\82³
\82ê
\82½
\83V
\83F
\83\8b\83\8a\83\93\83N
\83I
\83u
\83W
\83F
\83N
\83g</returns>
\r
269 public static ShellLink CreateFromProcessStartInfo(ProcessStartInfo procInfo)
\r
271 ShellLink shelllink = new ShellLink();
\r
272 shelllink.Path = procInfo.FileName;
\r
273 shelllink.Arguments = procInfo.Arguments;
\r
274 shelllink.WorkingDirectory = procInfo.WorkingDirectory;
\r
275 shelllink.WindowStyle = procInfo.WindowStyle;
\r