我试图比较2个字符串(KeyCode和SerialN) 我已经尝试过一堆不同的aproaches ......但正如你在我的打印屏幕上看到的那样,既不是=或等于工作。
你能告诉我出了什么问题吗?
Private Function VerificaKeyCode(SerialN As String) As Boolean
Dim snEsq As Integer
Dim snDir As Integer
Dim KeyCode As String
Dim buffer As String
Dim ind As Short
VerificaKeyCode = False
buffer = Space(255)
For ind = 1 To 5
'UPGRADE_WARNING: App property App.EXEName has a new behavior. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6BA9B8D2-2A32-4B6E-8D36-44949974A5B4"'
GetPrivateProfileString(My.Application.Info.AssemblyName, "HD" & ind, "", buffer, Len(buffer), My.Application.Info.DirectoryPath & "\ServerHD.ini")
KeyCode = Trim(buffer)
If KeyCode <> "" Then
VerificaKeyCode = KeyCode.Equals(SerialN)
VerificaKeyCode = CBool(KeyCode = SerialN)
If VerificaKeyCode Then Exit Function
End If
Next ind
End Function
修改
显然字符串中有一个空字符,我需要以某种方式将其删除
答案 0 :(得分:1)
监视窗口中的表达式是陈旧的,如禁用的颜色和刷新/回收图标的存在所示。单击图标,将重新评估表达式并更新结果:
模仿你所拥有的,注意第一个表达是陈旧的和错误的。第二个已刷新/重新评估并报告正确的结果。只要执行一行代码,监视表达式就会被标记为陈旧/未更新。
使用.NET返回函数的更好方法是使用局部变量和Return
它。 local var允许您通过鼠标悬停轻松查看结果:
变量可能超出范围,但不能过时。
编辑4或5显示,虽然监视表达式 陈旧,但我们在pic中看到的既不证明也不反驳字符串不匹配,这显然是VB6 - &gt; .NET翻新(注意102警告)。
我们无法看到GetPrivateProfileString
的声明,但使用情况至少不是最理想的。
<DllImport("kernel32.dll", SetLastError:=True)>
Shared Function GetPrivateProfileString(appname As String,
keyname As String, def As String,
sbuffer As StringBuilder,
nSize As Int32,
strFile As String) As Integer
End Function
注意它是一个函数;它返回读入缓冲区的字符数。而不是Trim
不会删除NUL
,而是应该使用返回(如果不是字符串构建器)来获取指定的字符数。如果使用字符串缓冲区,则修剪为读取的字符数:
Dim n As Int32 = GetPrivateProfileString(...)
KeyCode = buffer.Substring(0, n)
StringBuilder应该为您做到这一点:
Dim buffer As New StringBuilder(255)
...
Dim n As Int32 = GetPrivateProfileString(..., buffer, buffer.Capacity)
KeyCode = buffer.ToString()
您仍然可以根据字符串的大小检查函数返回。
您可以完全跳过GetPrivateProfileString
并使用流阅读器自行阅读该文件。它应该比PInvoke更快,但至少,使用时不那么复杂。