7

我用 C++ 编写了一个小应用程序。UI 中有一个 ListBox。我想将 ListBox 的选定项用于只能使用 wstrings 的算法。

总而言之,我有两个问题:-如何转换我的

    String^ curItem = listBox2->SelectedItem->ToString();

到 wstring 测试?

- 代码中的 ^ 是什么意思?

非常感谢!

4

5 回答 5

19

它应该很简单:

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为您处理所有细节。

于 2012-12-26T23:16:00.923 回答
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());

诀窍是确保您使用互操作和编组,因为您必须跨越从托管代码到非托管代码的边界。

于 2012-12-26T23:15:23.607 回答
0

我的版本是:

Platform::String^ str = L"my text";

std::wstring wstring = str->Data();
于 2014-03-20T00:05:14.267 回答
0

据微软称:

参考如何:将 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
于 2021-07-20T21:06:36.867 回答
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();
于 2015-12-12T00:15:55.217 回答