从RegQueryValueEx返回的Concat字符串

时间:2008-12-03 17:36:21

标签: 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 & "blah-blah-blah"

RegQueryValueEx()工作正常,我在sString中获取所需的字符串,甚至可以使用MsgBox显示它。但是当我尝试用“some_string”连接它时,我只得到了sString。 Plz,帮帮我。

由于

6 个答案:

答案 0 :(得分:6)

字符串中可能存在空字符,因为VB字符串将字符串的长度存储在字符串内容之前的内存中。在你的情况下,长度为256.当你使用RegQueryValueEx加载内容时,它会终止字符串(C风格),但不会更改其指定的长度,因此在VB世界中它仍然是256个字符长。然后当你追加第二个字符串时,它会在前256个字符后附加,但MsgBox只显示最多为空字符的内容。

因为RegQueryValueEx将实际数据的长度放在sLength中,所以可以在MsgBox之前添加这一行

sString = Left$(sString, sLength)

答案 1 :(得分:1)

优先权问题,也许吧?怎么样尝试:

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

或者

Dim sDisplay as String
sDisplay = sString & "blah-blah"

MsgBox sDisplay

答案 2 :(得分:0)

也许字符串包含0个字符,以便它过早结束?

答案 3 :(得分:0)

你需要在最后摆脱空字符。 我建议收到一份已经编写并经过测试的registry module for VB6Here is another example from vbnet 但是,如果你只是想摆脱零点,那么就是我用过的。

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

答案 4 :(得分:0)

使用Mid $和sLength从sString中提取字符串值。这样你就会因为额外的字符而感到陌生(比如空终结符'0')

请记住,当您处理Win32 API时,您必须记住它假定C约定与VB约定不同。所以在发送之前你必须做一些清理工作。

答案 5 :(得分:0)

当我这样做时,它对我有用:

string = Left $(string,Length-1)

问题确实是字符串末尾的空字符。

谢谢,伙计们!