【问题标题】:C# .NET 4.5 Getting target of shortcut without shell32.shell()C# .NET 4.5 在没有 shell32.shell() 的情况下获取快捷方式的目标
【发布时间】:2016-03-12 12:31:47
【问题描述】:

我不是一个非常有经验的程序员,也是 C# 的新手,我在使用 shell32.shell() 获取快捷方式的目标时遇到了一些问题。 我在 stackoverflow 上找到了代码 - 它在常规 Windows PC 上运行良好,但在 Citrix 虚拟化 Windows 桌面(我需要它运行的地方)上执行时,它会中断。

代码通过 foreach 循环通过文件夹中的快捷方式运行,并过滤掉任何具有可执行目标的内容。问题是,为了找到快捷方式的目标,我使用下面的代码,一旦它被称为 foreach 就会中断并且不再继续(在 Citrix 上)。

我已确定中断发生在“var shl = new Shell32.Shell();”行,该行之后的代码不会触发并退出 foreach(但在 foreach 之后继续执行代码)。

public static string GetLnkTarget(string lnkPath)
{
    var shl = new Shell32.Shell();
    lnkPath = System.IO.Path.GetFullPath(lnkPath);
    var dir = shl.NameSpace(System.IO.Path.GetDirectoryName(lnkPath));
    var itm = dir.Items().Item(System.IO.Path.GetFileName(lnkPath));
    var lnk = (Shell32.ShellLinkObject)itm.GetLink;
    return lnk.Target.Path;
}

有没有人知道另一种方法来查找可在 Citrix 虚拟化环境中工作的快捷方式的目标?

【问题讨论】:

  • 从您的代码中删除 try/catch 并重试,以便正确记录您的问题。
  • 我会尝试,但我的问题是我无法在 Citrix 环境中运行调试器,所以我正在使用消息框 atm。在任何情况下,我都相当确定代码会在该行中断,因为任何消息框在它触发之前但任何之后都不会。如果还有其他方法可以获取快捷方式目标,那么问题就更大了?
  • 如果没有 try/catch,应用程序在到达需要使用该代码检查的快捷方式时只会崩溃。由于我无法访问 Citrix 中的调试器,因此很遗憾:/
  • 每个 .NET 程序员最终都会发现,为 AppDomain.CurrentDomain.UnhandledException 编写事件处理程序不是可选的。你还没有完成。
  • 你可以试试this answer。看起来 COM 对象不想被实例化。

标签: c# .net-4.5 citrix shortcuts shell32.dll


【解决方案1】:

我不知道是什么导致了 Shell32.Shell() 的问题,特别是在 Citrix 环境中,但我找到了另一种适合我的方法。 答案由用户djdanlib 提供:https://stackoverflow.com/a/8661371/5992820

“添加 IWshRuntimeLibrary 作为对项目的引用。添加引用、COM 选项卡、Windows 脚本宿主对象模型。 以下是我获取快捷方式属性的方法:

IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass();
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename);

快捷方式对象“sc”有一个 TargetPath 属性。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多