【问题标题】:Creating symbolic links using Visual Basic使用 Visual Basic 创建符号链接
【发布时间】:2015-08-03 19:52:34
【问题描述】:

使用 Visual Basic 创建符号链接的最简单方法是什么?以下代码是我使用 Win32 API 编写的简单代码,但似乎无法正常工作:

Imports System.Runtime.InteropServices
Public Class SymbolicLinker
   Private Enum SymbolicLink
      File = 0
      Directory = 1
   End Enum

  <DllImport("kernel32.dll")> _
  Private Shared Function CreateSymbolicLink(lpSymlinkFileName As String, lpTargetFileName As String, dwFlags As SymbolicLink) As Boolean
  End Function
End Class

让我困惑的是以下 C# 代码可以正常工作:

using System.Runtime.InteropServices;

namespace Testbed_SymbolicLinks
{
   class SymbolicLinker
   {
       [DllImport("kernel32.dll")]
       static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, SymbolicLink dwFlags);

       enum SymbolicLink
       {
           File = 0,
           Directory = 1
       }
}

}

我是否以某种方式错误地将代码从 C# 移植到 VB?

编辑: 我的用例很简单:

Module Module1
    Sub Main()
        Console.WriteLine("Entering application.")
        Try
            CreateNewSymbolicLink()
        Catch e As Exception
            Console.WriteLine("An error occured.")
        End Try
        Console.ReadKey()
    End Sub
    Sub CreateNewSymbolicLink()
        Console.WriteLine("Enter the name of a valid file:  ")
        Dim file As String = Console.ReadLine()
        Console.WriteLine("Enter the name of a symbolic file:  ")
        Dim symbol As String = Console.ReadLine()
        Dim success As Boolean = SymbolicLinker.CreateSymbolicLink(symbol, file, SymbolicLink.File)
        If success Then
            Console.WriteLine("Web call was success")
        Else
            Console.WriteLine("Web call was a failure")
        End If
    End Sub
End Module

【问题讨论】:

  • 不要忘记CreateSymbolicLink 在普通系统上需要提升。
  • 请出示 MCVE。我们看不到您如何调用该函数。 “不工作”对我们没有用。您必须准确并提供详细信息。
  • @DavidHeffernan 在这种情况下,我认为很明显“不工作”意味着在调用函数时没有创建符号链接,但如果你必须,我已经添加了我的 MCVE。
  • @JonathanPotter 乔纳森,感谢您的回复。很抱歉这个基本问题,但你能解释一下这是什么意思吗?谢谢。
  • 他的意思是你必须以管理员权限运行应用程序。

标签: c# .net vb.net winapi


【解决方案1】:

你还没有展示你的真实代码,所以不可能说出哪里出了问题。这是有效的代码:

Imports System.Runtime.InteropServices

Public Class SymbolicLinker

    Public Enum SymbolicLink
        File = 0
        Directory = 1
    End Enum

    <DllImport("kernel32.dll", SetLastError:=True)> _
    Public Shared Function CreateSymbolicLink(lpSymlinkFileName As String, _
                                              lpTargetFileName As String, _
                                              dwFlags As SymbolicLink) As Boolean
    End Function

End Class

Module Module1

    Sub Main()
        CreateNewSymbolicLink("C:\Users\xxx\Desktop\link.txt", _
                              "C:\Users\xxx\Desktop\foo.txt")
        Console.ReadKey()
    End Sub

    Sub CreateNewSymbolicLink(linkName As String, targetName As String)
        If Not SymbolicLinker.CreateSymbolicLink(linkName, targetName, _
                                                 SymbolicLinker.SymbolicLink.File) Then
            Console.WriteLine(Marshal.GetLastWin32Error())
        End If
    End Sub

End Module

请注意,我将SetLastError 参数添加到DllImport 属性。这允许我们在失败的情况下捕获错误代码。我还演示了如何获取该错误代码,以及何时获取。也就是说,当且仅当,函数返回值表示失败。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2019-04-18
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多