Эти хорошо используемые функции демонстрируют, как преобразовать строку в байтовый массив и передать ее управляемой функции c ++ в виде закрепленного IntPtr:
Public Function b_fromString(ByRef str As String) As Byte()
If Not str Is Nothing Then
Return System.Text.Encoding.Default.GetBytes(str, 0, str.Length)
Else
Return New Byte() {}
End If
End Function
Public Function cString(ByRef theString As String) As IntPtr
Dim GC As System.Runtime.InteropServices.GCHandle = System.Runtime.InteropServices.GCHandle.Alloc(b_fromString(theString & Chr(0)), System.Runtime.InteropServices.GCHandleType.Pinned)
Dim ret As IntPtr = GC.AddrOfPinnedObject
GC.Free()
Return ret
End Function
Этот стиль функции можно использовать в управляемой оболочке c ++:
long libinterface::loadData(System::IntPtr bytes, long length)
{ return lib->functionName((char*)bytes.ToPointer(), length);
}
Длина строки обычно необязательна при использовании строки с нулевым символом в конце. Полезно, если не идеально.
Представлено для справки.
дополнительно - загрузка других массивов и растровых изображений:
Public Sub New(ByRef _obj As Array, ByRef read As Boolean, ByRef write As Boolean)
Me.size = Marshal.SizeOf(_obj(0))
Me.count = _obj.LongLength
Me.ptr = GCHandle.Alloc(_obj, GCHandleType.Pinned)
Me.id = lib.addBuffer(count * size, read, write, ptr.AddrOfPinnedObject)
End Sub
Public Function getimgPtr(ByRef img As Bitmap) As IntPtr
Dim f As System.Drawing.Imaging.BitmapData = img.LockBits(New Rectangle(0, 0, img.Width, img.Height), Imaging.ImageLockMode.ReadOnly, img.PixelFormat)
getimgPtr = f.Scan0
img.UnlockBits(f)
End Function