OSDN Git Service

AppliStation,バージョンを1.1.0.*に変更。ソースファイルへのコメントの加筆
[applistation/AppliStation.git] / na-get-lib / NaGet.InteropServices / ShellLink.cs
1 using System;\r
2 using System.Text;\r
3 using System.Runtime.InteropServices;\r
4 using System.Runtime.InteropServices.ComTypes;\r
5 using System.Diagnostics;\r
6 \r
7 namespace NaGet.InteropServices\r
8 {       \r
9         /// <summary>\r
10         /// ShellLink\82Ì\8dX\90V\83t\83\89\83O\r
11         /// </summary>\r
12         [Flags]\r
13         public enum ShellLinkResolve : uint\r
14         {\r
15                 // AnyMatch = 0x02, // winMe,win2k\88È\8d~\96³\8cø\r
16                 \r
17                 /// <summary>\r
18                 /// MSI\82ð\8cÄ\82Ô\r
19                 /// </summary>\r
20                 InvokeMSI = 0x80,\r
21                 /// <summary>\r
22                 /// \92Ç\90Õ\8bÖ\8e~\r
23                 /// </summary>\r
24                 NoLinkInfo = 0x40,\r
25                 /// <summary>\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
27                 /// </summary>\r
28                 NoUi = 0x01,\r
29                 NoUiWithMsgPump = 0x101,\r
30                 /// <summary>\r
31                 /// \83\8a\83\93\83N\90æ\82Ì\83f\81[\83^\8dX\90V\82ð\8ds\82í\82È\82¢\r
32                 /// </summary>\r
33                 NoUpdate = 0x07,\r
34                 /// <summary>\r
35                 /// \8c\9f\8dõ\82ð\82µ\82È\82¢\r
36                 /// </summary>\r
37                 NoSearch = 0x10,\r
38                 NoTrack = 0x20,\r
39                 /// <summary>\r
40                 /// \83\8a\83\93\83N\90æ\82ð\8dX\90V\82·\82é\r
41                 /// </summary>\r
42                 Update = 0x04,\r
43         }\r
44         \r
45         [ComImport()]\r
46         [Guid("000214F9-0000-0000-C000-000000000046")]\r
47         [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]\r
48         public interface IShellLinkW\r
49         {\r
50                 void GetPath([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile,\r
51                              int cchMaxPath, IntPtr pfd, uint fFlags);\r
52                 \r
53                 void GetIDList(out IntPtr ppidl);\r
54                 void SetIDList(IntPtr pidl);\r
55                 \r
56                 void GetDescription([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDesc,\r
57                                          int cchMaxPath);\r
58                 void SetDescription(string pszDesc);\r
59                 \r
60                 void GetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir,\r
61                                          int cchMaxPath);\r
62                 void SetWorkingDirectory(string pszDir);\r
63                 \r
64                 void GetArguments([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs,\r
65                                          int cchMaxPath);\r
66                 void SetArguments(string pszArgs);\r
67                 \r
68                 void GetHotkey(out short pwHotkey);\r
69                 void SetHotkey(short pwHotkey);\r
70                 \r
71                 void GetShowCmd(out uint piShowCmd);\r
72                 void SetShowCmd(uint piShowCmd);\r
73                 \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
77                 \r
78                 void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszPath,\r
79                                          int cchMaxPath, uint dwReserved);\r
80                 \r
81                 void Resolve(IntPtr hWnd, ShellLinkResolve fFlag);\r
82                                 \r
83                 void SetPath(string pszFile);\r
84         }\r
85 \r
86         /// <summary>\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
88         /// </summary>\r
89         public class ShellLink : IDisposable\r
90         {\r
91                 /// <summary>\r
92                 /// \83V\83F\83\8b\83\8a\83\93\83N\82ÌCOM\83I\83u\83W\83F\83N\83g\r
93                 /// </summary>\r
94                 protected IShellLinkW shellLink;\r
95                 \r
96                 /// <summary>\r
97                 /// \83V\83F\83\8b\83\8a\83\93\83N\82ÌGUID\r
98                 /// </summary>\r
99                 public const string ShellLinkGuid = "00021401-0000-0000-C000-000000000046";\r
100                 \r
101                 protected const int MAX_PATH = 260;\r
102                 \r
103                 public ShellLink()\r
104                 {\r
105                         Type shellLinkType = Type.GetTypeFromCLSID(new Guid(ShellLinkGuid));\r
106                         shellLink = (IShellLinkW) Activator.CreateInstance(shellLinkType);\r
107                 }\r
108                 \r
109                 public ShellLink(string path) : this()\r
110                 {\r
111                         if (! System.IO.File.Exists(path)) {\r
112                                 throw new System.IO.FileNotFoundException("File does not found", path);\r
113                         }\r
114                         \r
115                         ToPersistFile().Load(path, 0);\r
116                         Resolve(IntPtr.Zero, ShellLinkResolve.NoUpdate | ShellLinkResolve.NoUi);\r
117                 }\r
118                 \r
119                 /// <summary>\r
120                 /// \83V\83F\83\8b\83\8a\83\93\83N\82Ì\89ð\90Í\89ð\8c\88\r
121                 /// </summary>\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
125                 {\r
126                         shellLink.Resolve(hWnd ?? IntPtr.Zero, fFlags);\r
127                 }\r
128                 \r
129                 /// <summary>\r
130                 /// IPersistFile\82Æ\82µ\82Ä\8eæ\82è\8fo\82·\r
131                 /// </summary>\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
134                 {\r
135                         return (IPersistFile) shellLink;\r
136                 }\r
137                 \r
138                 /// <summary>\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
140                 /// </summary>\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
144                 {\r
145                         StringBuilder sb = new StringBuilder(MAX_PATH);\r
146                         shellLink.GetPath(sb, sb.Capacity, IntPtr.Zero, fFlags);\r
147                         return sb.ToString();\r
148                 }\r
149                 \r
150                 /// <summary>\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
152                 /// </summary>\r
153                 public string Path {\r
154                         get { return GetPath(0x04); }\r
155                         set { shellLink.SetPath(value); }\r
156                 }\r
157                 \r
158                 /// <summary>\r
159                 /// \83\8a\83\93\83N\90æ(\88ø\90\94)\r
160                 /// </summary>\r
161                 public string Arguments {\r
162                         get {\r
163                                 StringBuilder sb = new StringBuilder(MAX_PATH);\r
164                                 shellLink.GetArguments(sb, sb.Capacity);\r
165                                 return sb.ToString();\r
166                         }\r
167                         set { shellLink.SetArguments(value); }\r
168                 }\r
169                 \r
170                 /// <summary>\r
171                 /// \8dì\8bÆ\83t\83H\83\8b\83_\r
172                 /// </summary>\r
173                 public string WorkingDirectory {\r
174                         get {\r
175                                 StringBuilder sb = new StringBuilder(MAX_PATH);\r
176                                 shellLink.GetWorkingDirectory(sb, sb.Capacity);\r
177                                 return sb.ToString();\r
178                         }\r
179                         set { shellLink.SetWorkingDirectory(value); }\r
180                 }\r
181                 \r
182                 /// <summary>\r
183                 /// \83E\83B\83\93\83h\83E\83X\83^\83C\83\8b(ShowCmd\82Ì\83\8f\83b\83p)\r
184                 /// </summary>\r
185                 public ProcessWindowStyle WindowStyle\r
186                 {\r
187                         get {\r
188                                 uint showcmd;\r
189                                 shellLink.GetShowCmd(out showcmd);\r
190                                 switch (showcmd) {\r
191                                         case 3:\r
192                                                 return ProcessWindowStyle.Maximized;\r
193                                         case 7:\r
194                                                 return ProcessWindowStyle.Minimized;\r
195                                         case 1:\r
196                                         default:\r
197                                                 return ProcessWindowStyle.Normal;\r
198                                 }\r
199                         }\r
200                         set {\r
201                                 switch (value) {\r
202                                         case ProcessWindowStyle.Normal:\r
203                                                 shellLink.SetShowCmd(1);\r
204                                                 break;\r
205                                         case ProcessWindowStyle.Maximized:\r
206                                                 shellLink.SetShowCmd(3);\r
207                                                 break;\r
208                                         case ProcessWindowStyle.Minimized:\r
209                                         case ProcessWindowStyle.Hidden:\r
210                                                 shellLink.SetShowCmd(7);\r
211                                                 break;\r
212                                 }\r
213                         }\r
214                 }\r
215                 \r
216                 /// <summary>\r
217                 /// \83A\83C\83R\83\93\82Ì\8fê\8f\8a\82ð\93¾\82é\r
218                 /// </summary>\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
222                 {\r
223                         StringBuilder sb = new StringBuilder(MAX_PATH);\r
224                         shellLink.GetIconLocation(sb, sb.Capacity, out iconIndex);\r
225                         iconPath = sb.ToString();\r
226                 }\r
227                 \r
228                 /// <summary>\r
229                 /// \83A\83C\83R\83\93\82Ì\8fê\8f\8a\82ð\90Ý\92è\82·\82é\r
230                 /// </summary>\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
234                 {\r
235                         shellLink.SetIconLocation(iconPath, iconIndex);\r
236                 }\r
237                 \r
238                 /// <summary>\r
239                 /// COM\83I\83u\83W\83F\83N\83g\82Ì\8aJ\95ú\r
240                 /// </summary>\r
241                 public void Dispose()\r
242                 {\r
243                         if (shellLink != null) {\r
244                                 Marshal.ReleaseComObject(shellLink);\r
245                                 shellLink = null;\r
246                         }\r
247                 }\r
248 \r
249                 /// <summary>\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
251                 /// </summary>\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
254                 {\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
260                         \r
261                         return procInfo;\r
262                 }\r
263                 \r
264                 /// <summary>\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
266                 /// </summary>\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
270                 {\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
276                         \r
277                         return shelllink;\r
278                 }\r
279         }\r
280 }\r