Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 如何转换';系统::字符串^';至';TCHAR';? 我问了一个涉及C++和C语言交流的问题。这个问题解决了,但又引出了一个新问题_Visual Studio 2010_Visual C++_Casting_C++ Cli_Tchar - Fatal编程技术网

Visual studio 2010 如何转换';系统::字符串^';至';TCHAR';? 我问了一个涉及C++和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#)

这需要一个TCHAR*(C++)


我在谷歌上搜索了如何解决这个问题,但我不确定为什么字符串上有胡萝卜(^)。将字符串返回到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));
}