System :: String to QString - PullRequest
       36

System :: String to QString

1 голос
/ 13 апреля 2011

Я звоню в библиотеку c ++ и пишу управляемый класс-оболочку C ++ вокруг библиотеки.Методы принимают параметры QString, а иногда и ссылки на QString, так что значение может быть заполнено. Я попытался использовать std :: string, и, кажется, все в порядке, пока я не скомпилирую его и не свяжу его с c #, это как объявления методовне существуетТак что теперь я пытаюсь передать System :: String, но я не могу понять, как преобразовать это в QString.Таким образом, ответ на этот вопрос может прийти в одной из 2 форм.1. Почему я не могу ссылаться на методы в c # на управляемый код c ++, имеющий параметры std :: string?Или, как мне преобразовать System :: String в QString?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2011

Почему я не могу ссылаться на методы в c # на управляемый код c ++, имеющий параметры std :: string?

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

Или, как преобразовать System :: String в QString?

#include <string>
#include <QString>
#include <msclr/marshal_cppstd.h>

QString SystemStringToQString(System::String^ str)
{
    using namespace msclr::interop;
    return QString::fromStdWString(marshal_as<std::wstring>(str));
}

EDIT (в ответ на комментарии к ответу # 6205169):

Предлагаемое исправление утечки памяти:

std::wstring MarshalString(String^ s)
{
    using namespace System::Runtime::InteropServices;
    std::wstring ret;
    IntPtr p = Marshal::StringToHGlobalUni(s);
    if (p.ToPointer())
    {
        ret.assign((wchar_t const*)p.ToPointer());
        Marshal::FreeHGlobal(p);
    }
    return ret;
}

С точки зрения производительности, это гораздо менее эффективно, чем могло бы быть, но этодолжно работать и не должно течь.

0 голосов
/ 01 июня 2011

Ну, я на полпути.Мне просто нужно знать, создают ли эти методы утечку памяти и что я могу с этим сделать

Я создал несколько вспомогательных методов для этого.Мне нужно было сделать это, чтобы перейти от старой библиотеки Qt к CLI String.Я не могу обновить библиотеку Qt, поскольку у меня нет никакого контроля над этой частью кода.

void MarshalString (  String ^ s, wstring& os ) {
    using namespace Runtime::InteropServices;
    const wchar_t* char = 
        (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
    os = char;
}
QString SystemStringToQt( System::String^ str)
{
    wstring t;
    MarshalString(str, t);
    QString r = QString::fromUcs2((const ushort*)t.c_str());
    return r;
}
String ^ QtToSystemString( QString * str)
{

    wchar_t * wcar = (wchar_t *)str->ucs2();
    String^ r = gcnew String(wcar);
    return r;
}
0 голосов
/ 13 апреля 2011

Смотрите это:

http://www.codeguru.com/forum/showthread.php?t=372298

Это должно привести вас к char*, который легко конвертируется в QString.

...