我用C ++编写了一个小应用程序。 UI中有一个ListBox。我想使用ListBox的选定项目作为算法,我只能使用wstrings。
总而言之,我有两个问题: - 我可以如何转换我的
String^ curItem = listBox2->SelectedItem->ToString();
到wstring测试?
- 代码中的^是什么意思?
非常感谢!
答案 0 :(得分:10)
应该如此简单:
std::wstring result = msclr::interop::marshal_as<std::wstring>(curItem);
您还需要使用头文件来完成这项工作:
#include <msclr\marshal.h>
#include <msclr\marshal_cppstd.h>
对于好奇的人来说,这个marshal_as
专业化的内容是什么样的:
#include <vcclr.h>
pin_ptr<WCHAR> content = PtrToStringChars(curItem);
std::wstring result(content, curItem->Length);
这是有效的,因为System::String
在内部存储为宽字符。如果您想要std::string
,则必须使用例如{1}}执行Unicode转换。 WideCharToMultiByte
。方便marshal_as
为您处理所有细节。
答案 1 :(得分:0)
我将此标记为重复,但这里是关于如何从System.String^
转到std::string
的答案。
String^ test = L"I am a .Net string of type System::String";
IntPtr ptrToNativeString = Marshal::StringToHGlobalAnsi(test);
char* nativeString = static_cast<char*>(ptrToNativeString.ToPointer());
技巧是确保使用Interop和编组,因为您必须越过托管代码到非托管代码的边界。
答案 2 :(得分:0)
我的版本是:
Platform::String^ str = L"my text";
std::wstring wstring = str->Data();
答案 3 :(得分:0)
使用Visual Studio 2015,只需执行以下操作:
String^ s = "Bonjour!";
<强> C ++ / CLI 强>
#include <vcclr.h>
pin_ptr<const wchar_t> ptr = PtrToStringChars(s);
<强> C ++ / CX 强>
const wchart_t* ptr = s->Data();
答案 4 :(得分:0)
据微软称:
参考 How to: Convert System::String to Standard String
<块引用>您可以将字符串转换为 std::string 或 std::wstring,而无需在 Vcclr.h 中使用 PtrToStringChars。
// convert_system_string.cpp
// compile with: /clr
#include <string>
#include <iostream>
using namespace std;
using namespace System;
void MarshalString ( String ^ s, string& os ) {
using namespace Runtime::InteropServices;
const char* chars =
(const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
}
void MarshalString ( String ^ s, wstring& os ) {
using namespace Runtime::InteropServices;
const wchar_t* chars =
(const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
}
int main() {
string a = "test";
wstring b = L"test2";
String ^ c = gcnew String("abcd");
cout << a << endl;
MarshalString(c, a);
c = "efgh";
MarshalString(c, b);
cout << a << endl;
wcout << b << endl;
}
输出:
test
abcd
efgh