使用GetDiskFreeSpaceExA时出现不平衡的堆栈错误

时间:2011-04-27 09:19:00

标签: c# vb.net

以下代码(调用proc 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路径(本地和/或网络)。

2 个答案:

答案 0 :(得分:3)

我认为你的签名问题。尝试使用此(from 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

返回值的差异

答案 1 :(得分:0)

我对此代码不太确定,但您也可以使用代码My.Computer.FileSystem.Drives找出空闲,已用和总空间。我觉得使用.NET内置函数更容易,而不是尝试使用Windows DLL中的调用,因为毕竟.NET应用程序只能在.NET版本大于或等于.NET版本的计算机上运行。应用程序已建立!

干杯