Строки Concat возвращаются из RegQueryValueEx - PullRequest
0 голосов
/ 03 декабря 2008

Я хочу прочитать строковое значение из реестра и объединить его с другой определенной строкой. Я звоню 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. Пожалуйста, помогите мне.

Спасибо

Ответы [ 6 ]

6 голосов
/ 03 декабря 2008

Возможно, в строке есть нулевой символ, потому что строки VB хранят длину строки в памяти непосредственно перед содержимым строки. В вашем случае эта длина равна 256. Когда вы загружаете контент, используя RegQueryValueEx, он завершает строку нулем (в стиле C), но не меняет указанную длину, поэтому в мире VB он по-прежнему длиной 256 символов. Затем, когда вы добавляете вторую строку, она добавляется после первых 256 символов, но MsgBox показывает содержимое только до нулевого символа.

Поскольку RegQueryValueEx помещает длину фактических данных в sLength, вы можете добавить эту строку перед MsgBox

sString = Left$(sString, sLength)
1 голос
/ 03 декабря 2008

Вопрос приоритета, может быть? Как насчет попытки:

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

Или

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

MsgBox sDisplay
0 голосов
/ 04 декабря 2008

Это сработало для меня, когда я сделал:

sString = Left $ (sString, sLength-1)

проблема действительно была в нулевом символе в конце строки.

Спасибо, ребята!

0 голосов
/ 03 декабря 2008

используйте Mid $ и sLength для извлечения строковых значений из sString. Таким образом, вы выше странности из-за дополнительных символов (например, нулевого терминатора '0')

Помните, что когда вы имеете дело с Win32 API, вы должны помнить, что он предполагает соглашения C, которые не совпадают с соглашениями VB. Таким образом, вы должны сделать некоторую очистку перед отправкой.

0 голосов
/ 03 декабря 2008

Вам нужно избавиться от нулевого символа в конце. Я предлагаю получить уже написанный и протестированный модуль реестра для 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
0 голосов
/ 03 декабря 2008

Возможно, строка содержит 0 символов, чтобы преждевременно заканчиваться?

...