我用 C++ 编写了一个小应用程序。UI 中有一个 ListBox。我想将 ListBox 的选定项用于只能使用 wstrings 的算法。
总而言之,我有两个问题:-如何转换我的
String^ curItem = listBox2->SelectedItem->ToString();
到 wstring 测试?
- 代码中的 ^ 是什么意思?
非常感谢!
我用 C++ 编写了一个小应用程序。UI 中有一个 ListBox。我想将 ListBox 的选定项用于只能使用 wstrings 的算法。
总而言之,我有两个问题:-如何转换我的
String^ curItem = listBox2->SelectedItem->ToString();
到 wstring 测试?
- 代码中的 ^ 是什么意思?
非常感谢!
它应该很简单:
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
,你必须使用例如执行 Unicode 转换WideCharToMultiByte
。方便marshal_as
为您处理所有细节。
我将此标记为重复项,但这是有关如何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());
诀窍是确保您使用互操作和编组,因为您必须跨越从托管代码到非托管代码的边界。
我的版本是:
Platform::String^ str = L"my text";
std::wstring wstring = str->Data();
据微软称:
参考如何:将 System::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
使用 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();