2008-12-03 2 views
0

Я хочу прочитать строковое значение из реестра и объединить его с другой определенной строкой. Я звоню RegQueryValueEx(), как это:Конкатентные строки, возвращаемые из 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. Плц, помоги мне.

Thanks

ответ

1

Приоритет вопроса, может быть? Как о попытке:

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

Или

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

MsgBox sDisplay 
0

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

0

Вам нужно избавиться от нулевого символа в конце. Предлагаю получить уже написанные и протестированные registry module for VB6. Here 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 
0

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

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

6

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

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

sString = Left$(sString, sLength) 
+0

Вам нужна sLength - 1 as sLength - длина, включая нулевой символ. – 2008-12-03 18:23:36

0

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

sString = Left $ (sString, sLength-1)

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

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