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);
War es hilfreich?

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
scroll top