【问题标题】:C++/CLI Converting System::String to const char*C++/CLI 将 System::String 转换为 const char*
【发布时间】:2010-02-27 14:34:54
【问题描述】:

我正在使用 Microsoft Visual C++ 2008 我想加入一些字符串,然后将它与“系统”命令一起使用。

我试着这样做:

System::String^ link;
link = "wget.exe --output-document=log http://ADDRESS";
link = link + System::String::Copy(textBox_login->Text);
link = link + "&passwd=";
link = link + System::String::Copy(textBox_passwd->Text);
system(link); //LINE WITH ERROR

但我收到错误 C2664: 'system' : cannot convert parameter 1 from 'System::String ^' to 'const char *'

感谢您的帮助;)

【问题讨论】:

标签: string visual-c++ c++-cli system


【解决方案1】:

看看this questionthis question

本质上,问题在于system 函数需要const char* 类型的变量,而不是System::String

因此,您需要将字符串转换为 const char*(使用来自 this answer 的代码)并将其用作系统函数的参数。

IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
const char* linkStr = static_cast<char*>(p.ToPointer());
system(linkStr);
Marshal::FreeHGlobal(p);

【讨论】:

  • 一切正常,但是当它到达:link = link + "&passwd=" 它会删除字符串中的所有后缀
  • 你忘了打电话给Marshal::FreeHGlobal,这会泄漏内存。
  • 这不是异常安全的。使用 RAII。微软也已经为你构建了一个不错的 RAII 对象,marshal_context
【解决方案2】:

要像您一样使用系统,您需要编组。这需要额外的预防措施,这可能会导致无法预料的痛苦。

我建议您通过System::Process class 调用 wget

它与 .NET 集成得更好,您可以直接使用 System::String^

【讨论】:

    【解决方案3】:

    按照 Yacoby 说的做之后,几乎一切正常,但是当它到达时

    link = link + "&passwd=";
    

    它会删除字符串中的所有内容。 当我删除“&”时它工作得很好......我需要“&”符号

    【讨论】:

      【解决方案4】:

      您已获得解决问题的技术解决方案,但您可能还需要考虑以下几点:

      • 使用 API(.NET 或 C++,在 .NET 中比标准 C++ 更容易,请参阅 WebRequest)来执行此操作,而不是打开一个进程来为您执行 HTTP 请求。特别是如果您打算对响应做一些事情。

      • 一般来说,如果您要多次附加到String,则首选StringBuilder。由于 String 在 .NET 中是不可变的,因此每个追加都需要构造一个新的 String

      • 在这种情况下,不要首先使用 String 来构建 URL。请改用System::Uri

      【讨论】:

        猜你喜欢
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多