2012-06-18 27 views
15

Ich verwende eine Klasse, die StringHandle Feld hat, das ist ein IntPtr Wert, der eine LPCWSTR in C++ darstellt.make IntPtr in C# .NET zeigen auf Zeichenfolge Wert

internal IntPtr StringHandle; // LPCWSTR 

jetzt sagen, dass ich habe einen String: string x = "abcdefg"

Wie kann ich den String Griff verwenden, um den Anfang des String-zu-Punkt, so dass es wie C++ LPCWSTR ist?

+0

Warum möchten Sie das tun? –

+0

Ich arbeite mit Schnittstelle, die nur in nativem Code (C++) existiert, also verwende ich Interops von .NET. Die Klasse, die StringHandle hat, gehört jedoch nicht mir und ich möchte nicht ändern. –

+6

Weil das die Bibliothek ist, mit der er arbeitet. Nicht alles hat einen .NET-Wrapper, und selbst innerhalb des Frameworks kann die Marshal-Klasse einige gute Dienste leisten, wenn Sie mit Windows-Nachrichten auf niedriger Ebene zu tun haben. – KeithS

Antwort

24

Sie Marshal Klasse eine der StringTo * Methoden verwenden, müssen Sie die Zeichenfolge an den nicht verwalteten Speicher kopieren und dann die IntPtr von diesem Ort zu bekommen. Sie können so wie tun:

IntPtr strPtr = Marshal.StringToHGlobalUni(x); 

auch, benötigen Sie den nicht verwalteten Speicher, um sicherzustellen, zu befreien:

Marshal.FreeHGlobal(strPtr); 

es am besten, das alles schließlich/in einem Versuch zu tun.

+0

Ich brauchte eigentlich diese eine Marshal.StringToCoTaskMemUni, da ich COM benutze, aber danke –

7

Verwaltete Zeichenfolgen Verschieben Sie im Speicher, wenn der Garbage Collector den Heap komprimiert. Sie haben also keine stabile Adresse und können nicht direkt in einen LPCWSTR umgewandelt werden. Sie müssen die Zeichenfolge entweder mit GCHandle.Alloc() verknüpfen, um GCHandle.AddrOfPinnedObject zu verwenden, oder mit Marshal.StringToHGlobalUni() in den nicht verwalteten Speicher kopieren.

Dringend bevorzugen Sie zu kopieren, wenn die Adresse für eine Weile stabil sein muss.

+0

Liefert 'AddrOfPinnedObject' auf einer' string' einen Zeiger auf die Zeichendaten ('LPCWSTR' wie in der Frage erwähnt)? (Nach http://www.drdobbs.com/pinning-in-managed-c/184403869: Ja) –