В настоящее время я занят, чтобы получить текст из текстового поля, а затем преобразовать его в 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);
Вот вы найдете все возможные преобразования между 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);
Вы не читали 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);