【问题标题】:Concat strings returned from RegQueryValueEx从 RegQueryValueEx 返回的连接字符串
【发布时间】:2008-12-03 17:36:21
【问题描述】:

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

谢谢

【问题讨论】:

    标签: vb6 string-concatenation


    【解决方案1】:

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

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

    sString = Left$(sString, sLength)
    

    【讨论】:

    • 你需要 sLength - 1 因为 sLength 是包含空字符的长度。
    【解决方案2】:

    可能是优先级问题?试试看怎么样:

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

    或者

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你需要去掉最后的空字符。 我建议获得一个已经编写和测试过的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
        

        【讨论】:

          【解决方案5】:

          使用 Mid$ 和 sLength 将字符串值从 sString 中提取出来。这样你就可以避免由于额外的字符(如空终止符'0')而产生的陌生感

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

          【讨论】:

            【解决方案6】:

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

            sString = Left$(sString, sLength-1)
            

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

            谢谢各位!

            【讨论】:

              猜你喜欢
              • 2011-09-05
              • 1970-01-01
              • 1970-01-01
              • 2014-09-06
              • 1970-01-01
              • 1970-01-01
              • 2014-09-29
              • 2019-08-29
              • 1970-01-01
              相关资源
              最近更新 更多