使用GetDiskFreeSpaceExA时,堆栈不平衡错误

本文关键字:不平衡 错误 堆栈 GetDiskFreeSpaceExA 使用 | 更新日期: 2023-09-27 17:53:03

下面的代码(调用进程DiskFreeSpace)抛出"不平衡堆栈"错误消息

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _
                ByVal lpFreeBytesAvailableToCaller As Long, _
                ByVal lpTotalNumberOfBytes As Long, _
                ByVal lpTotalNumberOfFreeBytes As Long) As Long
Friend Shared Function DiskFreeSpace(ByVal sdirDrive As String) As Long
            Dim Status As Long
            Dim TotalBytes As Long
            Dim FreeBytes As Long
            Dim BytesAvailableToCaller As Long
            Status = GetDiskFreeSpaceEx(sdirDrive, BytesAvailableToCaller, TotalBytes, FreeBytes)
            Return FreeBytes
        End Function

怎么了?

确切的错误信息是:

调用PInvoke函数"测试! XYZ.Test.FN.MyFileSystem:: GetDiskFreeSpaceEx"使堆栈不平衡。这是可能是因为托管的PInvoke签名不匹配非管理对象目标的签名。检查一下的调用约定和参数PInvoke签名与目标匹配非托管签名。

附加说明:我的函数也需要为UNC路径工作(本地和/或网络)。

使用GetDiskFreeSpaceExA时,堆栈不平衡错误

我认为你的问题在签名。尝试使用这个(从pinvoke):

<DllImport("Kernel32.dll", EntryPoint:="GetDiskFreeSpaceEx", SetLastError:=True, CharSet:=CharSet.Auto)> _
  Private Shared Function GetDiskFreeSpaceEx( _
   ByVal lpDirectoryName As String, _
   ByRef lpFreeBytesAvailable As ULong, _
   ByRef lpTotalNumberOfBytes As ULong, _
   ByRef lpTotalNumberOfFreeBytes As ULong) As Boolean
  End Function

返回值差异

我不太确定这段代码,但您也可以使用代码My.Computer.FileSystem.Drives并找出空闲,已使用和总空间。我觉得使用。net内置函数比尝试使用来自Windows dll的调用更容易,因为毕竟。net应用程序只能在。net版本相同或更高的计算机上运行。net版本。

欢呼