以下代码(调用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路径(本地和/或网络)。
答案 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版本的计算机上运行。应用程序已建立!
干杯