Haven在很长一段时间内都没有使用过Windows Form,这是我第一次在C ++中使用它。
所以这是我第一次在数据类型和类对象之后遇到^的使用,例如:
Void Form1::btnConvert_Click(System::Object^ sender, System::EventArgs^ e)
幽灵般的东西。
我试图调用一个需要长指针到常量字符串的函数,所以const char *或LPCSTR。
const char* cPath = txtBoxPath->Text.c_str();
问题是当我尝试从字符串^转换时,我收到错误:
error C2228: left of '.c_str' must have class/struct/union
type is 'System::String ^'
did you intend to use '->' instead?
所以,现在我有点腌渍了。有什么建议?也许教育我一点这个^符号,因为我在Google上搜索时似乎找不到任何东西。
答案 0 :(得分:3)
您可以通过以下方式将System::String
转换为std::string
:
// Requires:
#include <msclr/marshal_cppstd.h>
auto str = msclr::interop::marshal_as<std::string>(txtBoxPath->Text);
获得std::string
后,c_str()
将为您提供const char*
:
const char* cPath = str.c_str();
请注意,您也可以使用Marshal
直接进行转换,即:
IntPtr tmpHandle = Marshal::StringToHGlobalAnsi(txtBoxPath->Text);
char *cPath = static_cast<char*>(tmpHandle.ToPointer());
// use cPath
Marshal::FreeHGlobal(tmpHandle); // Don't use cPath after this...
答案 1 :(得分:0)
^字符表示托管指针(或引用)。 txtBoxPath :: Text是System :: String类型的引用。您需要取消引用它以使用点运算符或只使用 - &gt;。
对于System :: String ^ to char *,请尝试以下操作:
char* cPath = (char*)Marshal::StringToHGlobalAnsi(txtBoxPath->Text).ToPointer();