如何将“ System :: String ^”转换为“ TCHAR”?

And*_*ndy 2 casting c++-cli tchar visual-studio-2010 visual-c++

在这里问了一个涉及C ++和C#通信的问题。问题得到解决,但导致了新问题。

这将返回一个字符串(C#)

return Marshal.PtrToStringAnsi(decryptsn(InpData));
Run Code Online (Sandbox Code Playgroud)

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

lpAlpha2[0] = Company::Pins::Bank::Decryption::Decrypt::Decryption("123456");
Run Code Online (Sandbox Code Playgroud)

我已经用谷歌搜索了如何解决这个问题,但是我不确定为什么字符串上有一个胡萝卜(^)。最好将String的返回值更改为C ++可以接受的其他值吗?还是我需要在分配值之前进行转换?

Dav*_*Yaw 5

字符串有一个,^因为这是托管引用的标记。基本上,它的使用方式与*在非托管区域中相同,只是它只能指向一个对象类型,而不能指向其他指针类型,或者指向void。

TCHAR已经#defined(或者通过typedef,我不记得了),要么charwchar_t的基础上,_UNICODE预处理器定义。因此,我将使用它并编写两次代码。

内联:

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));
Run Code Online (Sandbox Code Playgroud)

或作为一对转换方法,这两种方法都假定输出缓冲区已经分配并且足够大。方法重载应基于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));
}
Run Code Online (Sandbox Code Playgroud)