Public Type T_Struct
nombre As String
x As Long
y As Long
End Type
Si funciona pero te copia la dirección del string y no la cadena, vas a tener que modificar un poco la función y crear otra que te vuelva a rearmar la estructura. Te dejo un ejemplo de código:
Public Type T_Struct
nombre As String
x As Long
y As Long
End Type
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, Optional lpNumberOfBytesWritten As Long = 0) As Long
Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, Optional lpNumberOfBytesWritten As Long = 0) As Long
Declare Function GetCurrentProcess Lib "kernel32" () As Long
Function PackStr(lpStruct As T_Struct) As String
Dim sData$, r&
sData = String$(Len(lpStruct) - 4, 0)
'Lee a partir del registro x.
'
r = ReadProcessMemory(GetCurrentProcess(), VarPtr(lpStruct) + 4, ByVal sData, Len(sData))
sData = lpStruct.nombre & vbNullChar & sData
PackStr = sData
End Function
Function UnpackStr(StrSpec As String) As T_Struct
Dim sData$, r&
Dim iPos%, lpData As T_Struct
With lpData
iPos = InStr(1, StrSpec, vbNullChar)
If iPos = 0 Then Exit Function
.nombre = Left$(StrSpec, iPos - 1)
sData = Mid$(StrSpec, iPos + 1, Len(lpData) - 4)
r = WriteProcessMemory(GetCurrentProcess(), VarPtr(lpData) + 4, ByVal sData, Len(sData))
UnpackStr = lpData
End With
End Function