Not sure if this would work but I used this to move stuff among COM servers...

Try using LSet and defining a second UDT that has the same byte length as the UDT you're trying to pass.

Code:
Public udtMyType
     Name as string * 30
     City as string * 20
End Type

Public udtMyTypeSerialized
     Buffer as string *50
End Type

Public udtData as udtMyType
Public udtBuffer as udtMyTypeSerialized

With udtData
     .Name = "Achichincle"
     .City = "San Diego"
End with

LSet udtBuffer = udtData
Now udtBuffer is essentially a byte-array in memory of all your data so you should be able to CopyMemory it as needed.

When you get it to where you want it just do the LSet in reverse...

It was in a book I read...