Visual studio 2010 如何转换';系统::字符串^';至';TCHAR';? 我问了一个涉及C++和C语言交流的问题。这个问题解决了,但又引出了一个新问题
这将返回一个字符串(C#) 这需要一个TCHAR*(C++)Visual studio 2010 如何转换';系统::字符串^';至';TCHAR';? 我问了一个涉及C++和C语言交流的问题。这个问题解决了,但又引出了一个新问题,visual-studio-2010,visual-c++,casting,c++-cli,tchar,Visual Studio 2010,Visual C++,Casting,C++ Cli,Tchar,这将返回一个字符串(C#) 这需要一个TCHAR*(C++) 我在谷歌上搜索了如何解决这个问题,但我不确定为什么字符串上有胡萝卜(^)。将字符串返回到C++所接受的其他东西最好吗?或者我需要在赋值之前进行转换吗?这是一种非常杂乱的提问方式,但是如果您指的是如何将字符串^转换为字符*,那么您可以使用以前使用的封送拆收器,只是向后: char* unmanagedstring = (char *) Marshal::StringToHGlobalAnsi(managedstring).ToPoint
我在谷歌上搜索了如何解决这个问题,但我不确定为什么字符串上有胡萝卜(^)。将字符串返回到C++所接受的其他东西最好吗?或者我需要在赋值之前进行转换吗?这是一种非常杂乱的提问方式,但是如果您指的是如何将
字符串^
转换为字符*
,那么您可以使用以前使用的封送拆收器,只是向后:
char* unmanagedstring = (char *) Marshal::StringToHGlobalAnsi(managedstring).ToPointer();
编辑:使用
Marshal::FreeHGlobal
完成后,不要忘记释放分配的内存。语法String^
是C++/CLI talk,用于“(垃圾收集)对System.String的引用
您有两个选项可以将字符串
转换为C字符串,这是表示TCHAR*
的另一种方式。我在C++中首选的方法是将转换后的字符串存储到C++字符串类型中,无论是代码> STD::WString 还是 STD::String
,这取决于您将项目作为Unicode或MBCS项目来构建。
在任何一种情况下,您都可以使用如下内容:
std::wstring tmp = msclr::interop::marshal_as<std::wstring>( /* Your .NET String */ );
假设
callCFunction
希望您向其传递一个C样式的char*
或wchar\u t*
(其中TCHAR*
将“降级”取决于您的编译设置。字符串有一个^
,因为它是托管引用的标记。基本上,它与非托管区域中的*
使用方式相同,只是它只能指向对象类型,而不能指向其他指针类型或void
TCHAR
是基于#UNICODE预处理器定义的(或者可能是类型定义的,我不记得了)字符char
或wchar\u t
。因此,我将使用它并编写两次代码
内联:
TCHAR* str;
String^ managedString
#ifdef _UNICODE
str = (TCHAR*) Marshal::StringToHGlobalUni(managedString).ToPointer();
#else
str = (TCHAR*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();
#endif
// use str.
Marshal::FreeHGlobal(IntPtr(str));
或者作为一对转换方法,这两种方法都假设输出缓冲区已经被分配并且足够大。方法重载应该使它根据TCHAR的定义选择正确的方法
void ConvertManagedString(String^ managedString, char* outString)
{
char* str;
str = (char*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();
strcpy(outString, str);
Marshal::FreeHGlobal(IntPtr(str));
}
void ConvertManagedString(String^ managedString, wchar_t* outString)
{
wchar_t* str;
str = (wchar_t*) Marshal::StringToHGlobalUni(managedString).ToPointer();
wcscpy(outString, str);
Marshal::FreeHGlobal(IntPtr(str));
}
这两个STD都说WString或String不是STD的成员。我是否缺少了一个类型的引用?您需要在C++代码中包含<代码> > < <代码>以获得Eith.Re:FLAG的声明——您需要电子邮件。team@stackoverflow此外,吸取的教训?
HGLOBAL
不是char*
,而是不应该被强制转换为一个。要从HGLOBAL
中获取指针,请使用GlobalLock
。更好的是,完全避免HGLOBAL
。与Blindy相同的问题是,HGLOBAL
是不透明的结构,应该传递给GlobalLock
,以获取指向内容的指针。如果是这样,那么微软的文档ion是错误的。好吧,如果MEM\u FIXED
被传递到GlobalAlloc
,那么ion是不可操作的。但是MSDN没有说明StringToHGlobalAnsi
内部使用的标志。依赖示例,好像它们是规范的一部分,这是一个众所周知的坏主意。
std::string tmp = msclr::interop::marshal_as<std::string>(...);
callCFunction(tmp.c_str());
TCHAR* str;
String^ managedString
#ifdef _UNICODE
str = (TCHAR*) Marshal::StringToHGlobalUni(managedString).ToPointer();
#else
str = (TCHAR*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();
#endif
// use str.
Marshal::FreeHGlobal(IntPtr(str));
void ConvertManagedString(String^ managedString, char* outString)
{
char* str;
str = (char*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();
strcpy(outString, str);
Marshal::FreeHGlobal(IntPtr(str));
}
void ConvertManagedString(String^ managedString, wchar_t* outString)
{
wchar_t* str;
str = (wchar_t*) Marshal::StringToHGlobalUni(managedString).ToPointer();
wcscpy(outString, str);
Marshal::FreeHGlobal(IntPtr(str));
}