Преобразование между управляемым и неуправляемым типами в C ++? - PullRequest
1 голос
/ 12 апреля 2009

Когда я использую графический интерфейс в C ++, текстовые поля сохраняются как управляемые строки, я думаю. Мне нужен способ конвертировать их в стандартные int, float и string. Любая помощь?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2009

Вы можете преобразовать System.String в неуправляемый символ *, используя Marshal.StringToHGlobalAnsi . Убедитесь, что вы освободили его, когда закончите, позвонив по номеру Marshal.FreeHGlobal . Чтобы преобразовать строки в числовые значения, вы можете использовать обычные функции синтаксического анализа .NET, такие как Int32.Parse.

0 голосов
/ 22 апреля 2009

Вы можете просто преобразовать объекты System :: String ^ в MFC CString с помощью

CString* name = new CString(managedName);

где managedName является управляемой строкой.

0 голосов
/ 12 апреля 2009

Чтобы использовать управляемую память в собственном коде, сначала необходимо скопировать содержимое управляемой памяти в собственную память.

Так, например:

Копирование содержимого из управляемой памяти выполняется следующим образом:

const int len = 50;
BYTE *destination = new BYTE[nLength];
System::Byte source[] = new System::Byte[len];

System::Runtime::InteropServices::Marshal::
  Copy(source, 0, IntPtr((void *)destination, len);

Поскольку мы имеем дело с управляемой памятью, сборщик мусора может перемещать и перемещать управляемые данные в другое место, и все будет потеряно, если мы попытаемся найти данные, которые хотим преобразовать.

Поэтому мы хотим «закрепить его в памяти», используя __pin для преобразования из управляемого в неуправляемый:

const int len = 50;
BYTE *source              = new BYTE[len];
System::Byte destination[]     = new System::Byte[len];
BYTE __pin *managedData = &(destination[0]);

::memcpy(source, managedData, len);
...