我的代码有问题,可以在vb6上运行它,但不知何故在vb.net上崩溃了
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
这就是我调用该函数的方式:
Dim lRetval As Long
'Get Host IP Address in host.ini
sHostIP = Space(128)
lRetval = GetPrivateProfileString("HOSTPATH", "HOSTIP", "", sHostIP, Len(sHostIP), "Host.ini")
错误提示:
托管调试助手'PInvokeStackImbalance':'对PInvoke函数'BDS ByPass!CreateBulkCIF.GlobalClass :: GetPrivateProfileString的调用'使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。'
请帮助...我在任何地方都找不到有用的东西。
答案 0 :(得分:2)
此问题的最常见原因是使用旨在用于VB6而不是VB.NET的函数签名。如果您有一个参数或类型为Long
的返回值,那么几乎可以肯定是这种情况。 Windows API函数和其他非托管API通常使用32位整数。在VB6中,Long
类型为32位,而Integer
类型为16位。在VB.NET中,Long
类型是64位,而Integer
类型是32位。在VB.NET中,几乎应该始终使用Integer
而不是Long
。
Pinvoke.net显示该功能的签名,如下所示:
<DllImport("kernel32.dll", SetLastError:=True)>
Private Shared Function GetPrivateProfileString(ByVal lpAppName As String,
ByVal lpKeyName As String,
ByVal lpDefault As String,
ByVal lpReturnedString As StringBuilder,
ByVal nSize As Integer,
ByVal lpFileName As String) As Integer
End Function
您应该使用该网站作为VB.NET API签名的首选。