【问题标题】:CreateSymbolicLink on windows 10Windows 10 上的 CreateSymbolicLink
【发布时间】:2015-10-08 08:26:18
【问题描述】:

自从它们首次被引入以来,创建符号链接就需要一个完整的管理员。从正常或非提升的进程运行 CreateSymbolicLink 会失败。

在 Windows 10 中,CreateSymbolicLink 在这些情况下也会失败,即它不会创建任何内容,但是它会返回成功代码 (!),并且 GetLastError 也是 0。所以除了检查符号链接文件是否存在之外,没有其他方法可以检测到错误

看起来像 Windows 10 中的错误?

【问题讨论】:

  • 听起来像一个错误。但是您的代码可能是错误的。我们看不到它。
  • 我无法重现(预览版本 10547)。

标签: winapi symlink


【解决方案1】:

也有同样的经历。 但是:您似乎得到的成功代码是错误代码。所以似乎已经将 CreateSymbolicLink 的返回类型从 BOOLEAN 更改为 int

【讨论】:

  • 哎哟;如果是这样,那肯定是 Windows 错误。微软很容易忽视这一点:几乎没有人使用过该功能。 :-)
  • 我看到你在官方 MSDN 文档页面上发布了一个错误报告......希望有人会注意!
  • @nikos:我猜它已经修复了,因为我无法在最新的预览版本 (10547) 上重现。我没有要测试的 RTM 版本。有没有人可以重现问题,可以尝试升级到 10547 来确认是否可以解决问题?
  • 遗憾的是,这个错误再次出现,CreateSymbolicLink 在没有创建任何内容时返回类似 -1536 的内容,例如因为海拔限制。唯一的方法是使用 GetLastError
【解决方案2】:

这个解决方法对我有用:
将返回值更改为整数。

1 = 成功
对于所有其他值,请调用 GetLastWin32Error

[DllImport("kernel32.dll", EntryPoint = "CreateSymbolicLinkW", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, SYMBOLIC_LINK_FLAG dwFlags);

public static int CreateSymbolicLinkFix(string lpSymlinkFileName, string lpTargetFileName, int dwFlags) {
    var result = CreateSymbolicLink(lpSymlinkFileName, lpTargetFileName, dwFlags);
    if (result == 1) return 0; // Success
    return Marshal.GetLastWin32Error();
}

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2021-09-29
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多