Make IntPtr в С#.NET указывает на строковое значение - программирование
Подтвердить что ты не робот

Make IntPtr в С#.NET указывает на строковое значение

Я использую класс, у которого есть поле StringHandle, которое является значением IntPtr, которое представляет собой LPCWSTR в С++.

internal IntPtr StringHandle; // LPCWSTR

скажите теперь, что у меня есть строка: string x = "abcdefg"

Как я могу использовать дескриптор String для указания на начало строки, чтобы он был похож на С++ LPCWSTR?

4b9b3361

Ответ 1

Сначала вам нужно скопировать строку в неуправляемую память, а затем получить IntPtr из этого места. Вы можете сделать так:

IntPtr strPtr = Marshal.StringToHGlobalUni(x);

также необходимо освободить неуправляемую память:

Marshal.FreeHGlobal(strPtr);

лучше всего сделать это в попытке/наконец.

Ответ 2

Управляемые строки перемещаются в памяти, когда сборщик мусора сжимает кучу. Таким образом, они не имеют стабильного адреса и не могут быть напрямую переданы в LPCWSTR. Вам нужно будет либо связать строку с GCHandle.Alloc(), чтобы использовать GCHandle.AddrOfPinnedObject, либо скопировать ее в неуправляемую память с помощью Marshal.StringToHGlobalUni().

Сильно предпочитайте копировать, если на некоторое время адрес должен быть стабильным.

Ответ 3

Вы хотите использовать один из методов StringTo * в Marshal class