ما هي أفضل طريقة لتحويل بين شار* النظام::سلسلة في C++/CLI

StackOverflow https://stackoverflow.com/questions/56561

  •  09-06-2019
  •  | 
  •  

سؤال

ما هو المعتمدة طريقة التحويل من شار* النظام::سلسلة الظهر في C++/CLI ؟ وجدت بعض الإشارات إلى marshal_to<> قالب وظائف جوجل, ولكن يبدو أن هذه الميزة لم قطع Visual Studio 2005 (و ليس في Visual Studio 2008 ، AFAIK).لقد رأيت أيضا بعض التعليمات البرمجية على ستان ليبمان بلوق, لكنها من عام 2004.لقد رأيت أيضا المشير::StringToHGlobalAnsi().هل هناك طريقة التي تعتبر "أفضل الممارسات"?

هل كانت مفيدة؟

المحلول

هناك نظرة عامة جيدة هنا (هذا توجيه الدعم إضافة VS2008):http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

نصائح أخرى

النظام::سلسلة لديه منشئ أن يأخذ شار*:

 using namespace system;
 const char* charstr = "Hello, world!";
 String^ clistr = gcnew String(charstr);
 Console::WriteLine(clistr);

الحصول على شار* الظهر قليلا أكثر صعوبة ، ولكن لا بأس:

 IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
 char *pNewCharStr = static_cast<char*>(p.ToPointer());
 cout << pNewCharStr << endl;
 Marshal::FreeHGlobal(p);

ما قمنا به هو جعل C++\CLI الكائن الذي عقد السلسلة في unmangaed رمز و أن نعطيه أشبال نسخ من هذا البند.تحويل التعليمات البرمجية تبدو كثيرا مثل ما ستان على مدونته (لا أتذكر بالضبط)(إذا كنت تستخدم رمز له تأكد من تحديث لاستخدام حذف[]) ولكن نحن على يقين من أن المدمر سيكون التعامل مع الإفراج عن جميع unmanged عناصر من وجوه.هذا هو قليلا مبالغ فيها ولكن لم يكن لدينا تسريبات عندما تعادل في إرث C++ الوحدات البرمجية.

أنا خلقت بعض الطرق المساعد.كنت بحاجة للقيام بذلك على الانتقال من قديم Qt مكتبة CLI السلسلة.إذا كان أي شخص يمكن أن تضيف على هذا و قل لي إذا كان يبدو أن لدي مشكلة حدوث تسرب للذاكرة و ما يمكنني القيام به لإصلاح ذلك ، وأود أن تكون أكثر تقديرا.

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;
}

واحدة إضافية رابط ملخص طرق ممكنة:

http://support.microsoft.com/?kbid=311259

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top