Pointer Mathe in C #
-
03-07-2019 - |
Frage
Ich versuche, einige pinvoke Code zu verwenden, um eine C-Funktion aufrufen. Die Funktion füllt einen Puffer mit Daten.
Die Struktur wird als DWORD für die Länge, gefolgt von einem String aufgebaut. Wie entpacke ich die Zeichenfolge der IntPtr?
IntPtr buffer = Marshal.AllocHGlobal(nRequiredSize);
PInvokedFunction(buffer, nRequiredSize);
string s = Marshal.PtrToStringAuto(buffer + 4); //this is an error.
Marshal.FreeHGlobal(buffer);
Lösung
Sie sollten dies tun:
IntPtr sBuffer = new IntPtr( buffer.ToInt64() + 4 );
string s = Marshal.PtrToStringAuto( sBuffer );
So Ihr Code ist 64bit sicher.
Andere Tipps
Das Beste, was ich mit war folgende kommen konnte, obwohl die Verwendung des UnmanagedMemoryStream ein bisschen wie ein Hack scheint.
IntPtr buffer = Marshal.AllocHGlobal((int)nRequiredSize);
PInvokedFunction(buffer, nRequiredSize);
UnmanagedMemoryStream memStream = new UnmanagedMemoryStream(buffer.ToPointer(), nRequiredSize);
memStream.Seek(4, SeekOrigin.Begin);
IntPtr ptr = new IntPtr(memStream.PositionPointer);
string s = Marshal.PtrToStringAuto(ptr);
Marshal.FreeHGlobal(buffer);
Dies schien zu arbeiten, obwohl ich glaube, ich Matt Ellis Antwort besser gefällt.
Ich habe die IntPtr auf die [DllImport] auf ein byte [].
//allocate the buffer in .Net
byte[] buffer = new byte[nRequiredSize];
//call the WIN32 function, passing it the allocated buffer
PInvokedFunction(buffer);
//get the string from the 5th byte
string s = Marshal.PtrToStringAuto(Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 4));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow