0

我想从注册表中读取一个字符串值并将其与另一个特定字符串连接起来。我正在调用 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。请帮帮我。

谢谢

4

6 回答 6

6

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

因为 RegQueryValueEx 把实际数据的长度放在了 sLength 中,所以可以在 MsgBox 前面加上这一行

sString = Left$(sString, sLength)
于 2008-12-03T18:11:53.327 回答
1

优先级问题,也许?试试怎么样:

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

或者

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

MsgBox sDisplay
于 2008-12-03T17:44:31.683 回答
0

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

于 2008-12-03T17:49:25.463 回答
0

您需要在最后摆脱空字符。我建议为 VB6 获取一个已经编写和测试过的注册表模块这是来自 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
于 2008-12-03T18:03:12.830 回答
0

使用 Mid$ 和 sLength 从 sString 中提取字符串值。这样,由于额外的字符(例如空终止符“0”),您可以避免陌生感

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

于 2008-12-03T18:06:27.550 回答
0

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

sString = Left$(sString, sLength-1)

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

多谢你们!

于 2008-12-04T08:31:31.500 回答