将字符串^转换为常量字符* 在很长一段时间内都没有使用Windows窗体,这是我第一次在C++中使用它。

将字符串^转换为常量字符* 在很长一段时间内都没有使用Windows窗体,这是我第一次在C++中使用它。,c++,string,stl,c++-cli,C++,String,Stl,C++ Cli,因此,这是我第一次在数据类型和类对象之后使用^after,例如: Void Form1::btnConvert_Click(System::Object^ sender, System::EventArgs^ e) 可怕的东西 我试图调用一个函数,它需要一个指向常量字符串的长指针,即const char*或LPCSTR const char* cPath = txtBoxPath->Text.c_str(); 问题是,当我尝试从字符串^1转换时,我收到错误: error C2228

因此,这是我第一次在数据类型和类对象之后使用^after,例如:

Void Form1::btnConvert_Click(System::Object^  sender, System::EventArgs^  e)
可怕的东西

我试图调用一个函数,它需要一个指向常量字符串的长指针,即const char*或LPCSTR

const char* cPath = txtBoxPath->Text.c_str();
问题是,当我尝试从字符串^1转换时,我收到错误:

error C2228: left of '.c_str' must have class/struct/union
          type is 'System::String ^'
          did you intend to use '->' instead?

所以,现在我有点麻烦了。有什么建议吗?也许可以教我一点关于这个“^”符号的知识,因为我在谷歌搜索时似乎找不到它的任何内容。

字符“^”表示托管指针(或引用)。txtBoxPath::Text是System::String类型的引用。您需要取消引用它以使用点运算符或只使用->

对于System::String^ to char*请尝试以下操作:

char* cPath = (char*)Marshal::StringToHGlobalAnsi(txtBoxPath->Text).ToPointer();

您可以通过以下方式将
System::String
转换为
std::String

// Requires:
#include <msclr/marshal_cppstd.h>

auto str = msclr::interop::marshal_as<std::string>(txtBoxPath->Text);
请注意,您也可以使用
封送
直接进行转换,即:

IntPtr tmpHandle = Marshal::StringToHGlobalAnsi(txtBoxPath->Text);
char *cPath = static_cast<char*>(tmpHandle.ToPointer());

// use cPath

Marshal::FreeHGlobal(tmpHandle); // Don't use cPath after this...
intptrtmphandle=Marshal::StringToHGlobalAnsi(txtBoxPath->Text);
char*cPath=static_cast(tmpHandle.ToPointer());
//使用cPath
元帅:自由世界(tmpHandle);//在此之后不要使用cPath。。。

与“表单”无关,但与C++/CLI有很大关系。不过,这并不能解决转换为
const char*
的问题。@ReedCopsey您是对的-我添加了一个正确的示例来正确回答问题-谢谢,我很早就分心并提交了。请注意,这是内存泄漏。您需要保留句柄,并通过
marshall::FreeHGlobal
正确释放它。有关详细信息,请参阅我的答案。谢谢,我仍然会遇到一些错误:x我现在将快速阅读有关封送员的内容。错误C2653:“封送”:不是类或命名空间名称错误C2228:“.ToPointer”的左侧必须具有类/结构/union@ReedCopsey是的,没错。我做了一个(可能不好的)假设,开发人员会意识到他需要管理他的非托管内存。
IntPtr tmpHandle = Marshal::StringToHGlobalAnsi(txtBoxPath->Text);
char *cPath = static_cast<char*>(tmpHandle.ToPointer());

// use cPath

Marshal::FreeHGlobal(tmpHandle); // Don't use cPath after this...