使用 Visual Basic 创建符号链接

tho*_*ark 0 .net c# vb.net winapi

使用 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
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,以下 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
       }
}
Run Code Online (Sandbox Code Playgroud)

}

我是否以某种方式错误地将代码从 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

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

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
Run Code Online (Sandbox Code Playgroud)

请注意,我将SetLastError参数添加到了属性中DllImport。这使我们能够在发生故障时捕获错误代码。我还演示了如何获取该错误代码以及何时获取该错误代码。也就是说,当且仅当函数返回值指示失败。