从文本框到字符*的文本(转换/编组)

时间:2013-06-25 12:44:01

标签: c++ visual-studio-2012 marshalling managed-c++

目前我很忙从文本框中获取一些文本然后转换为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);

它在 Marshal::FreeHGlobal 下提供了红线(Visual Studio 2012)。有人可以给我一个正确的方向来从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);

2 个答案:

答案 0 :(得分:0)

Here您将在 char *,wchar_t *,_bstr_t,CComBSTR,CString,basic_string和System.String之间找到所有可能的转换。

  

涵盖的字符串类型包括char *,wchar_t *,_bstr_t,CComBSTR,CString,basic_string和System.String。在所有情况下,转换为新类型时都会生成字符串的副本。对新字符串所做的任何更改都不会影响原始字符串,反之亦然。

关于您添加的EDIT:

如果您至少可以尝试理解复制粘贴的代码,那将是很好的。这一行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);

答案 1 :(得分: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);