Excel VBA:Como passar uma string como ponteiro para um procedimento para anexar a string?

StackOverflow https://stackoverflow.com/questions/6045592

  •  15-11-2019
  •  | 
  •  

Pergunta

Quero passar uma String como parâmetro de entrada/saída para um procedimento.Eu sei que não é assim que o VBA normalmente funciona, mas isso ocorre por causa de um caso especial.Eu já tenho uma ferramenta geradora de código - gerando código para um analisador de formato de arquivo.E eu não quero hackear esse código.A sintaxe gerada pode ser facilmente convertida para vba usando texto, substitua isso sem grande problema (já fiz isso).Mas é difícil mudar procedimentos para funções.

O que descobri é como posso estender uma String passando seu ponteiro.Mas como posso acrescentar os caracteres à string?

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (Destination As Any, Source As Any, _
    ByVal length As Long)

Private Declare Function lstrlenA Lib "kernel32" _
   (ByVal lpString As Long) As Long

Private Declare Function lstrlenW Lib _
  "kernel32" (ByVal lpString As Long) As Long


Sub AppendString(i_pt As Long, i_what As String)
    Dim strLentgh As Long                  ' variable to hold the length of string
    Dim ptrLengthField As Long             ' pointer to 4-byte length field

    ' get the length of the string
    ptrLengthField = i_pt - 4              ' length field is 4 bytes behind
    CopyMemory strLentgh, ByVal ptrLengthField, 4

    ' extend the String length
    strLentgh = strLentgh + (Len(i_what) * 2)
    CopyMemory ByVal ptrLengthField, strLentgh&, 4

    ' How to apped the string?
    ' CopyMemory ByVal i_pt, ????
End Sub

Sub test2()
    Dim str As String
    Dim sPtr As Long

    str = "hello"
    sPtr = strPtr(str)

    Debug.Print Len(str)
    Call AppendString(sPtr, " there")
    Debug.Print Len(str)
    Debug.Print str
End Sub
Foi útil?

Solução

VBA pode fazer isso nativamente

Sub AppendString(byref str as string, i_what As String)
    str = str & i_what
end sub

Testar

Sub Test()
    Dim s As String

    s = "Hello"

    AppendString s, " World"
    Debug.Print s
End Sub
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top