Vb6 从RegQueryValueEx返回的Concat字符串

Vb6 从RegQueryValueEx返回的Concat字符串,vb6,string-concatenation,Vb6,String Concatenation,我想从注册表中读取一个字符串值,并将其与另一个特定字符串连接起来。我调用RegQueryValueEx(),如下所示: Dim lResult As Long Dim sLength As Long Dim sString As String sString = Space$(256) sLength = 256 lResult = RegQueryValueEx(hKey, "MyKey", 0, REG_SZ, ByVal sString, sLength) MsgBox sString

我想从注册表中读取一个字符串值,并将其与另一个特定字符串连接起来。我调用RegQueryValueEx(),如下所示:

Dim lResult As Long
Dim sLength As Long
Dim sString As String

sString = Space$(256)
sLength = 256

lResult = RegQueryValueEx(hKey, "MyKey", 0, REG_SZ, ByVal sString, sLength)
MsgBox sString & "blah-blah-blah"
RegQueryValueEx()工作正常,我在sString中获得了所需的字符串,甚至可以用MsgBox显示它。但当我试着用“一些字符串”来连接它时,我只看到了字符串。请帮帮我


谢谢,也许是优先权问题吧?尝试如何:

MsgBox(sString & "blah-blah-blah")


可能字符串包含0字符,因此过早结束?

您需要去掉结尾处的空字符。 我建议得到一份已经写好并经过测试的报告。 但是如果你只是想去掉空值,我用过一个

Public Function StringFromBuffer(ByRef strBuffer As String) As String
' Extracts String From a Buffer (buffer is terminated with null)
' 06/30/2000 - WSR

Dim lngPos As Long

    ' attempt to find null character in buffer
    lngPos = InStr(1, strBuffer, vbNullChar)

    ' if found
    If lngPos > 0 Then

        ' return everything before it
        StringFromBuffer = Left$(strBuffer, lngPos - 1)

    ' if not found
    Else

        ' return whole string
        StringFromBuffer = strBuffer

    End If ' lngPos > 0

End Function ' StringFromBuffer

使用Mid$和sLength从sString中提取字符串值。通过这种方式,您可以避免由于额外字符(如空终止符“0”)而产生的奇怪现象


请记住,当您处理Win32 API时,您必须记住它采用的C约定与VB约定不同。因此,在发送之前,您必须进行一些清理。

字符串中可能有一个空字符,因为VB字符串将字符串的长度存储在内存中,就在字符串内容之前。在你的情况下,长度是256。当您使用RegQueryValueEx加载内容时,它会以null终止字符串(C样式),但不会更改其指示的长度,因此在VB世界中,它仍然有256个字符长。然后,当您附加第二个字符串时,它将附加在前256个字符之后,但MsgBox仅显示空字符之前的内容

因为RegQueryValueEx将实际数据的长度以SLENGHT为单位,所以可以在MsgBox之前添加此行

sString = Left$(sString, sLength)

当我这样做时,它对我起了作用:

sString = Left$(sString, sLength-1)
问题确实是字符串末尾的空字符


谢谢,伙计们

您需要sLength-1,因为sLength是包含空字符的长度。
sString = Left$(sString, sLength-1)