-using System;\r
+using System;\r
using System.Text;\r
using System.Runtime.InteropServices;\r
using System.Runtime.InteropServices.ComTypes;\r
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
}\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
}\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
}\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
}\r
\r
/// <summary>\r
- /// \83\8a\83\93\83N\90æ(\88ø\90\94)\r
+ /// リンク先(引数)\r
/// </summary>\r
public string Arguments {\r
get {\r
}\r
\r
/// <summary>\r
- /// \8dì\8bÆ\83t\83H\83\8b\83_\r
+ /// 作業フォルダ\r
/// </summary>\r
public string WorkingDirectory {\r
get {\r
}\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
}\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
}\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
}\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
}\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
\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