OSDN Git Service

AppliStation-*,とりあえずの実装 of 「インストール先フォルダ」のところで実行ファイルを直接 実行できるように
[applistation/AppliStation.git] / na-get-lib / NaGet.InteropServices / ShellLink.cs
index 1188d92..12bf1eb 100644 (file)
@@ -1,4 +1,4 @@
-using System;\r
+using System;\r
 using System.Text;\r
 using System.Runtime.InteropServices;\r
 using System.Runtime.InteropServices.ComTypes;\r
@@ -7,37 +7,37 @@ using System.Diagnostics;
 namespace NaGet.InteropServices\r
 {      \r
        /// <summary>\r
-       /// ShellLink\82Ì\8dX\90V\83t\83\89\83O\r
+       /// ShellLinkの更新フラグ\r
        /// </summary>\r
        [Flags]\r
        public enum ShellLinkResolve : uint\r
        {\r
-               // AnyMatch = 0x02, // winMe,win2k\88È\8d~\96³\8cø\r
+               // AnyMatch = 0x02, // winMe,win2k以降無効\r
                \r
                /// <summary>\r
-               /// MSI\82ð\8cÄ\82Ô\r
+               /// MSIを呼ぶ\r
                /// </summary>\r
                InvokeMSI = 0x80,\r
                /// <summary>\r
-               /// \92Ç\90Õ\8bÖ\8e~\r
+               /// 追跡禁止\r
                /// </summary>\r
                NoLinkInfo = 0x40,\r
                /// <summary>\r
-               /// \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
+               /// リンク先の解決ができないときダイアログを表示しない\r
                /// </summary>\r
                NoUi = 0x01,\r
                NoUiWithMsgPump = 0x101,\r
                /// <summary>\r
-               /// \83\8a\83\93\83N\90æ\82Ì\83f\81[\83^\8dX\90V\82ð\8ds\82í\82È\82¢\r
+               /// リンク先のデータ更新を行わない\r
                /// </summary>\r
                NoUpdate = 0x07,\r
                /// <summary>\r
-               /// \8c\9f\8dõ\82ð\82µ\82È\82¢\r
+               /// 検索をしない\r
                /// </summary>\r
                NoSearch = 0x10,\r
                NoTrack = 0x20,\r
                /// <summary>\r
-               /// \83\8a\83\93\83N\90æ\82ð\8dX\90V\82·\82é\r
+               /// リンク先を更新する\r
                /// </summary>\r
                Update = 0x04,\r
        }\r
@@ -84,28 +84,35 @@ namespace NaGet.InteropServices
        }\r
 \r
        /// <summary>\r
-       /// \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
+       /// シェルリンク(ショートカット)のカプセルクラス\r
        /// </summary>\r
        public class ShellLink : IDisposable\r
        {\r
                /// <summary>\r
-               /// \83V\83F\83\8b\83\8a\83\93\83N\82ÌCOM\83I\83u\83W\83F\83N\83g\r
+               /// シェルリンクのCOMオブジェクト\r
                /// </summary>\r
                protected IShellLinkW shellLink;\r
                \r
                /// <summary>\r
-               /// \83V\83F\83\8b\83\8a\83\93\83N\82ÌGUID\r
+               /// シェルリンクのGUID\r
                /// </summary>\r
                public const string ShellLinkGuid = "00021401-0000-0000-C000-000000000046";\r
                \r
                protected const int MAX_PATH = 260;\r
                \r
+               /// <summary>\r
+               /// 新しいシェルリンクを作成する形のコンストラクタ\r
+               /// </summary>\r
                public ShellLink()\r
                {\r
                        Type shellLinkType = Type.GetTypeFromCLSID(new Guid(ShellLinkGuid));\r
                        shellLink = (IShellLinkW) Activator.CreateInstance(shellLinkType);\r
                }\r
                \r
+               /// <summary>\r
+               /// 既存のシェルリンクを開くコンストラクタ\r
+               /// </summary>\r
+               /// <param name="path">既存のシェルリンクのパス</param>\r
                public ShellLink(string path) : this()\r
                {\r
                        if (! System.IO.File.Exists(path)) {\r
@@ -117,29 +124,29 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \83V\83F\83\8b\83\8a\83\93\83N\82Ì\89ð\90Í\89ð\8c\88\r
+               /// シェルリンクの解析解決\r
                /// </summary>\r
-               /// <param name="hWnd">\90e\83t\83\8c\81[\83\80\82Ì\83n\83\93\83h\83\8b</param>\r
-               /// <param name="fFlags">\95û\96@</param>\r
+               /// <param name="hWnd">親フレームのハンドル</param>\r
+               /// <param name="fFlags">方法</param>\r
                public void Resolve(IntPtr? hWnd, ShellLinkResolve fFlags)\r
                {\r
                        shellLink.Resolve(hWnd ?? IntPtr.Zero, fFlags);\r
                }\r
                \r
                /// <summary>\r
-               /// IPersistFile\82Æ\82µ\82Ä\8eæ\82è\8fo\82·\r
+               /// IPersistFileとして取り出す\r
                /// </summary>\r
-               /// <returns>IPersistFile\82É\83L\83\83\83X\83g\82³\82ê\82½COM\83I\83u\83W\83F\83N\83g</returns>\r
+               /// <returns>IPersistFileにキャストされたCOMオブジェクト</returns>\r
                public IPersistFile ToPersistFile()\r
                {\r
                        return (IPersistFile) shellLink;\r
                }\r
                \r
                /// <summary>\r
-               /// \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
+               /// リンク先パスを得る。コマンドラインを得るためにも\r
                /// </summary>\r
-               /// <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
-               /// <returns>\83p\83X</returns>\r
+               /// <param name="fFlags">パスのタイプ(1:8.3形式; 2:UNCパス; 4:環境変数変換なし)</param>\r
+               /// <returns>パス</returns>\r
                public string GetPath(uint fFlags)\r
                {\r
                        StringBuilder sb = new StringBuilder(MAX_PATH);\r
@@ -148,7 +155,7 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \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
+               /// リンク先パス(取得時には環境変数は展開されません)\r
                /// </summary>\r
                public string Path {\r
                        get { return GetPath(0x04); }\r
@@ -156,7 +163,7 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \83\8a\83\93\83N\90æ(\88ø\90\94)\r
+               /// リンク先(引数)\r
                /// </summary>\r
                public string Arguments {\r
                        get {\r
@@ -168,7 +175,7 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \8dì\8bÆ\83t\83H\83\8b\83_\r
+               /// 作業フォルダ\r
                /// </summary>\r
                public string WorkingDirectory {\r
                        get {\r
@@ -180,7 +187,7 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \83E\83B\83\93\83h\83E\83X\83^\83C\83\8b(ShowCmd\82Ì\83\8f\83b\83p)\r
+               /// ウィンドウスタイル(ShowCmdのワッパ)\r
                /// </summary>\r
                public ProcessWindowStyle WindowStyle\r
                {\r
@@ -214,10 +221,10 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \83A\83C\83R\83\93\82Ì\8fê\8f\8a\82ð\93¾\82é\r
+               /// アイコンの場所を得る\r
                /// </summary>\r
-               /// <param name="iconPath">\83A\83C\83R\83\93\82ð\8aÜ\82Þ\83t\83@\83C\83\8b\83p\83X</param>\r
-               /// <param name="iconIndex">\83A\83C\83R\83\93\82Ì\83C\83\93\83f\83b\83N\83X</param>\r
+               /// <param name="iconPath">アイコンを含むファイルパス</param>\r
+               /// <param name="iconIndex">アイコンのインデックス</param>\r
                public void GetIconLocation(out string iconPath, out int iconIndex)\r
                {\r
                        StringBuilder sb = new StringBuilder(MAX_PATH);\r
@@ -226,17 +233,17 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \83A\83C\83R\83\93\82Ì\8fê\8f\8a\82ð\90Ý\92è\82·\82é\r
+               /// アイコンの場所を設定する\r
                /// </summary>\r
-               /// <param name="iconPath">\83A\83C\83R\83\93\82ð\8aÜ\82Þ\83t\83@\83C\83\8b\83p\83X</param>\r
-               /// <param name="iconIndex">\83A\83C\83R\83\93\82Ì\83C\83\93\83f\83b\83N\83X</param>\r
+               /// <param name="iconPath">アイコンを含むファイルパス</param>\r
+               /// <param name="iconIndex">アイコンのインデックス</param>\r
                public void SetIconLocation(string iconPath, int iconIndex)\r
                {\r
                        shellLink.SetIconLocation(iconPath, iconIndex);\r
                }\r
                \r
                /// <summary>\r
-               /// COM\83I\83u\83W\83F\83N\83g\82Ì\8aJ\95ú\r
+               /// COMオブジェクトの開放\r
                /// </summary>\r
                public void Dispose()\r
                {\r
@@ -247,9 +254,9 @@ namespace NaGet.InteropServices
                }\r
 \r
                /// <summary>\r
-               /// \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
+               /// シェルリンクの中身をプロセス情報として取得する。起動の際に利用\r
                /// </summary>\r
-               /// <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
+               /// <returns>プロセス起動情報化されたシェルリンクの情報</returns>\r
                public ProcessStartInfo ToProcessStartInfo()\r
                {\r
                        ProcessStartInfo procInfo = new ProcessStartInfo();\r
@@ -262,10 +269,10 @@ namespace NaGet.InteropServices
                }\r
                \r
                /// <summary>\r
-               /// \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
+               /// プロセス情報からシェルリンクオブジェクトを生成\r
                /// </summary>\r
-               /// <param name="procInfo">\83v\83\8d\83Z\83X\8fî\95ñ</param>\r
-               /// <returns>\90\90¬\82³\82ê\82½\83V\83F\83\8b\83\8a\83\93\83N\83I\83u\83W\83F\83N\83g</returns>\r
+               /// <param name="procInfo">プロセス情報</param>\r
+               /// <returns>生成されたシェルリンクオブジェクト</returns>\r
                public static ShellLink CreateFromProcessStartInfo(ProcessStartInfo procInfo)\r
                {\r
                        ShellLink shelllink = new ShellLink();\r
@@ -276,5 +283,32 @@ namespace NaGet.InteropServices
                        \r
                        return shelllink;\r
                }\r
+               \r
+               /// <summary>\r
+               /// ショートカット先のEXEファイルに対して適切な名前を生成する。\r
+               /// \r
+               /// 具体的には、アセンブリの製品名をまず優先的に使い、\r
+               /// それがなければ、exeファイルのファイル名(拡張子を除いたもの)を返す。\r
+               /// \r
+               /// 拡張子はつかないので、lnkファイル名に使う場合は、手動で\r
+               /// <code>".lnk"</code>を追加すること。\r
+               /// </summary>\r
+               /// <returns>拡張子を含まない、適切な名前</returns>\r
+               public string GetSuitableShellLinkNameFor()\r
+               {\r
+                       string exeFile = GetPath(0);\r
+                       \r
+                       try {\r
+                               FileVersionInfo vInfo = FileVersionInfo.GetVersionInfo(exeFile);\r
+                               if (vInfo.ProductName != null && vInfo.ProductName != string.Empty\r
+                                   && vInfo.ProductName.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) < 0) {\r
+                                       // 原則、製品名を採用\r
+                                       return vInfo.ProductName;\r
+                               }\r
+                       } catch (Exception) {}\r
+\r
+                       // そのほかの場合は、*.exeファイルの名前をそのまま使用\r
+                       return System.IO.Path.GetFileNameWithoutExtension(exeFile);\r
+               }\r
        }\r
 }\r