【发布时间】:2019-06-21 16:19:45
【问题描述】:
在 C# 程序中,我希望能够识别 LNK 文件的文件位置(实际文件位置,而不是 LNK 位置)。但有时 ShellLink 会返回文件的旧位置。例如,它返回“C:\Program Files (x86)\XXX\xxx.exe”而不是“C:\Program Files\XXX\xxx.exe”(LNK 文件中的实际文本)。 我认为旧位置可能缓存在注册表中,但找不到该字符串。 关于如何确保 ShellLink 识别正确位置或修复此特定“坏”链接的任何想法?我重新创建了链接并重新启动,但这没有帮助。
/// <summary>Given a LNK file, return the file that it points to.</summary>
public static string ResolveShortcut(string filename)
{
ShellLink link = new ShellLink();
((IPersistFile)link).Load(filename, STGM_READ);
StringBuilder sb = new StringBuilder(MAX_PATH);
WIN32_FIND_DATAW data = new WIN32_FIND_DATAW();
((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0);
if (sb.Length == 0 && !filename.EndsWith(".LNK", StringComparison.OrdinalIgnoreCase)) sb.Append(filename);
return sb.ToString();
}
【问题讨论】:
-
你能贴出你用来从 ShellLink 拉取文件位置的代码吗?
-
如果
Program Files的路径被环境变量(%programfiles%) 引用,则扩展变量(如Environment.ExpandEnvironmentVariables())会根据可执行文件的位数返回路径。即,如果您以 x86 为目标或选择了Prefer 32-bit,则环境变量将返回[Drive]:\Program Files (x86)。 -
LNK 中的路径没有使用任何环境变量。这基本上就是我在问题中指定的内容。
-
用this之类的东西验证物理内容。