ما هي أفضل طريقة لتحويل بين شار* النظام::سلسلة في C++/CLI
سؤال
ما هو المعتمدة طريقة التحويل من شار* النظام::سلسلة الظهر في 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;
}
واحدة إضافية رابط ملخص طرق ممكنة: