Текст из текстового поля в символ * (преобразование / маршал)

В настоящее время я занят, чтобы получить текст из текстового поля, а затем преобразовать его в const char *. У меня есть следующий код:

System::String^ host = textBoxHostadres->Text;
const char* host2 = (const char*)(void*)Marshal::StringToHGlobalAnsi(host);
//system(host2); //What to do with this?
Marshal::FreeHGlobal(host2);

Это дает красную линию (Visual Studio 2012) под Marshal::FreeHGlobal. Может ли кто-нибудь дать мне правильное направление, чтобы получить текст от textbox и получить это к const char*? Первая строка работает хорошо, и после отладки я вижу, что текст захвачен.

Обновить:

System::String^ host = textBoxHostadres->Text;
pin_ptr<const wchar_t> wch = PtrToStringChars(host);

// Convert to a char*
size_t origsize = wcslen(wch) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
char nstring[newsize];
wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
strcat_s(nstring, " (char *)");

const char* host2 = (const char*)(void*)Marshal::StringToHGlobalAnsi(host);
system(host2);

traceroute hostAddress(host2);

0

Решение

Вот вы найдете все возможные преобразования между char *, wchar_t *, _bstr_t, CComBSTR, CString, basic_string и System.String.

В число рассматриваемых типов строк входят char *, wchar_t *, _bstr_t, CComBSTR, CString, basic_string и System.String. Во всех случаях копия строки создается при преобразовании в новый тип. Любые изменения, внесенные в новую строку, не влияют на исходную строку, и наоборот.

Что касается изменений, которые вы добавили:

Было бы неплохо, по крайней мере, попытаться понять код, который вы копируете. Эта линия strcat_s(nstring, " (char *)"); добавляет некоторые символы в вашу строку и в основном (char *) и это очевидно теперь, когда ваш nstring не содержит адрес файла уже, но адрес + немного мусора. Также вам не нужна эта строка std::cout << nstring << std::endl; совсем.

Вот как должна выглядеть ваша реализация.

System::String^ host = textBoxHostadres->Text;
pin_ptr<const wchar_t> wch = PtrToStringChars(host);
// Convert to a char*
size_t origsize = wcslen(wch) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
char nstring[newsize];  // nstring is an array of chars
wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
// strcat_s(nstring, " (char *)");  this line adds trash to your nstring!!!
traceroute hostAddress(nstring);
0

Другие решения

Вы не читали host2 в вашем звонке Marshal::FreeHGlobal():

System::String^ host = textBoxHostadres->Text;
const char* host2 = (const char*)(void*)Marshal::StringToHGlobalAnsi(host);
system(host2);
traceroute hostAddress(host2);
Marshal::FreeHGlobal((IntPtr) host2);
0

По вопросам рекламы [email protected]