2013-08-30 4 views
0

У меня есть строка:Как преобразовать строку в объект System :: Object?

myFunc(std::string text) {} 

, и я хочу, чтобы преобразовать его в System :: Object. Что-то вроде ...

array<Object^>^ inArgs = gcnew array<Object^>(2); 
const char* ms;   
ms = text.c_str(); 
inArgs[1] = *ms; 

За исключением случаев, когда я пытаюсь получить строку, это дает мне только первый символ.

... он не должен быть std :: string. будет выполняться строка любого типа. im делает обновление в поперечном потоке и пытается передать строку.

+0

10 Я думаю, вы имеете в виду: «Как вы можете преобразовать std :: string в String ^?». В любом случае, ищите 'Marshal :: PtrToStringAnsi'. – user2246674

+0

omg, который сработал! благодаря! если вы опубликуете это в качестве ответа, я его приму. – user1873073

+0

Отправьте код, в котором вы закончили использование с соответствующими ресурсами/ссылками и само-принимайте :-) – user2246674

ответ

2

System :: String имеет конструктор, который принимает const char *. Вы не выглядите придирчивыми к правильному преобразованию кодовой страницы, поэтому, вероятно, это будет нормально:

std::string test("hello world"); 
    auto managed = gcnew String(test.c_str()); 
    Console::WriteLine(managed); 
0

Этот код, вероятно, далеко от правильного пути. Я просто эмулирую то, что я делаю на C# для обновлений кросс-потоков. Фактический ответ исходил из комментариев.

инициализации формы, делегаты установки, запуска второй нитки:

public ref class Form_1 : public System::Windows::Forms::Form 
{ 
    public: 
     CL* c; 
     delegate System::Void CrossThreadUpdate(Object^ obj); 
     CrossThreadUpdate^ crossThreadUpdate; 
     void update(Object^ obj); 
     Thread^ t; 
     void updateTextArea(String^ text); 
     void initCL(); 

     Form_1(void) 
     { 
      InitializeComponent(); 
      crossThreadUpdate = gcnew CrossThreadUpdate(this, &Form_1::update); 
      t = gcnew Thread(gcnew ThreadStart(this, &Form_1::initCL)); 
      t->Start(); 
      // 
      //TODO: Add the constructor code here 
      // 
     } 

нить делает свое дело, а затем позволяет нам его сделали

void Form_1::initCL() 
{ 
    c = new CL(); 
    updateTextArea("CL READY"); 
} 

обновление формы

void Form_1::update(Object^ obj) { 
     array<Object^>^ arr = (array<Object^>^)obj; 
     int^ op = safe_cast<int^>(arr[0]); 

     switch(*op) 
     { 
      case 1: 
       String^ text = safe_cast<String^>(arr[1]); 
       wstring stringConvert = L""; 
       MarshalString(text, stringConvert); 
       wcout << stringConvert << endl; 
       this->textBox1->Text += text + "\r\n"; 
       break; 
     } 
    } 

    void Form_1::updateTextArea(String^ text) { 
     array<Object^>^ args = gcnew array<Object^>(1); 
     array<Object^>^ inArgs = gcnew array<Object^>(2); 
     inArgs[0] = 1; 
     inArgs[1] = text; 
     args[0] = inArgs; 
     this->Invoke(crossThreadUpdate, args); 
    } 
Смежные вопросы