конвертировать из System.String в PCTSTR - PullRequest
0 голосов
/ 12 августа 2011

Мне нужно преобразовать из System.String (C #) в PCTSTR, который будет напечатан как _nullterminated const char *

Пока я не могу найти ничего, что могло бы точно сказать мне, как это сделать.

Множество примеров для преобразования из System :: String (C ++ / CLI), но я ничего не могу найти в System.String (C #)

Я работаю в Visual Studio 2005.

Ответы [ 3 ]

4 голосов
/ 12 августа 2011

Когда PCTSTR является typedef для const char*, используйте Marshal.StringToHGlobalAnsi .

Если PCTSTR является typedef для const wchar_t*, используйте Marshal.StringToHGlobalUni .

В обоих случаях вызовите Marshal.FreeHGlobal , чтобы освободить память, когда закончите с ней; несмотря на то, что вы используете C #, выделение памяти, о которой идет речь, неуправляемо, поэтому, следовательно, не подходит для сборки мусора, и будет протекать, если вы не очистите его должным образом.

4 голосов
/ 12 августа 2011

Если вы хотите использовать его в вызове PInvoke, вы можете просто объявить параметр как string и использовать MarshalAs(UnmanagedType.LPStr):

[DllImport("somelib.dll")]
static extern void function([MarshalAs(UnmanagedType.LPStr)] string s);
4 голосов
/ 12 августа 2011

Вы должны использовать статический класс Marshal

var str = "Hello world" 
var marshalledStr = Marshal.StringToHGlobalUni(str).ToPointer()

См. Полный справочник по сортировке http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.aspx

...