如何将\'System :: String ^\'转换为\'TCHAR\'?

| 我在这里问了一个涉及C ++和C#通信的问题。问题得到解决,但导致了新问题。 这将返回一个字符串(C#)
return Marshal.PtrToStringAnsi(decryptsn(InpData));
这需要一个TCHAR *(C ++)
lpAlpha2[0] = Company::Pins::Bank::Decryption::Decrypt::Decryption(\"123456\");
我已经用谷歌搜索了如何解决这个问题,但是我不确定为什么字符串上有一个胡萝卜(^)。最好将String的返回值更改为C ++可以接受的其他值吗?还是我需要在分配值之前进行转换?     
已邀请:
这确实是一个令人毛骨悚然的问题,但是,如果您的意思是如何将
String ^
转换为
char *
,那么您将使用之前使用的编组器,但只能倒退:
char* unmanagedstring = (char *) Marshal::StringToHGlobalAnsi(managedstring).ToPointer();
编辑:使用ѭ5键完成操作后,不要忘记释放分配的内存。     
字符串有一个“ 6”,因为这是托管引用的标记。基本上,它与非托管区域中的ѭ7用法相同,不同之处在于它只能指向对象类型,不能指向其他指针类型,也可以指向void。 根据_UNICODE预处理器的定义,将#8定义为(9,或者我不记得键入)到
char
wchar_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));
}
    
语法“ 13”是C ++ / CLI对话,用于对“对System.String \的引用(收集的垃圾)”。 您可以使用几种选择将
String
转换为C字符串,这是表示
TCHAR*
的另一种方法。我在C ++中的首选方式是将转换后的字符串存储为C ++字符串类型,即
std::wstring
std::string
,具体取决于您将项目构建为Unicode还是MBCS项目。 无论哪种情况,您都可以使用以下方法:
std::wstring tmp = msclr::interop::marshal_as<std::wstring>( /* Your .NET String */ );
要么
std::string tmp = msclr::interop::marshal_as<std::string>(...);
将字符串转换为正确的宽或窄字符串格式后,即可使用
c_str()
函数访问其C字符串表示形式,如下所示:
callCFunction(tmp.c_str());
假设
callCFunction
希望您通过C风格的
char*
wchar_t*
(根据您的编译设置,
TCHAR*
将“降级”到)。     

要回复问题请先登录注册