Cách được chấp thuận để chuyển đổi từ char * thành System :: string và ngược lại trong C++/CLI là gì? Tôi tìm thấy một vài tài liệu tham khảo để marshal_to <> chức năng templated trên Google, nhưng nó xuất hiện rằng tính năng này không bao giờ thực hiện cắt cho Visual Studio 2005 (và không phải là trong Visual Studio 2008 hoặc, AFAIK). Tôi cũng đã thấy một số mã trên Stan Lippman's blog, nhưng nó là từ năm 2004. Tôi cũng đã thấy Marshal :: StringToHGlobalAnsi(). Có phương pháp nào được coi là "thực hành tốt nhất" không?Cách tốt nhất để chuyển đổi giữa char * và System :: String trong C++/CLI
Trả lời
Có một cái nhìn tổng quan tốt ở đây (hỗ trợ marshaling này bổ sung cho VS2008): http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
Những gì chúng tôi đã làm được tạo thành một đối tượng C++ \ CLI giữ chuỗi trong mã không bị sửa đổi và sẽ đưa ra các bản sao đã được mang của mục đó. Mã chuyển đổi trông rất giống với những gì Stan có trên blog của anh ấy (tôi không thể nhớ chính xác) (Nếu bạn sử dụng mã của anh ta chắc chắn rằng bạn cập nhật nó để sử dụng delete []) nhưng chúng tôi đảm bảo rằng trình hủy sẽ xử lý tất cả các yếu tố chưa được khắc phục của đối tượng. Đây là một chút thổi phồng nhưng chúng tôi không có rò rỉ khi chúng ta gắn vào các mô-đun mã C++ kế thừa.
Hệ thống :: String có một constructor mà phải mất một char *:
using namespace system;
const char* charstr = "Hello, world!";
String^ clistr = gcnew String(charstr);
Console::WriteLine(clistr);
Bắt một char * lại là khó hơn một chút, nhưng không quá tệ:
IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
char *pNewCharStr = static_cast<char*>(p.ToPointer());
cout << pNewCharStr << endl;
Marshal::FreeHGlobal(p);
+1, System :: String constructor cũng có độ dài và mã hóa! –
'Marshal :: StringToHGlobalAnsi' là một tùy chọn nghèo so với' marshal_context' (như được đề cập bởi Matthew), sử dụng RAII để tự động giải phóng bộ đệm. Chưa kể rằng cái tên hoàn toàn sai, nó không trả về một 'HGLOBAL' chút nào. –
Tôi đã tạo một vài phương pháp trợ giúp. Tôi cần làm điều này để chuyển từ thư viện Qt cũ sang chuỗi CLI. Nếu bất cứ ai có thể thêm vào điều này và cho tôi biết nếu nó có vẻ như tôi có một rò rỉ bộ nhớ và những gì tôi có thể làm để sửa chữa nó, tôi sẽ được đánh giá cao nhất.
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;
}
Có thể phải đối chiếu Marshal :: FreeHGlobal (IntPtr ((void *) chars)); nó –
@Pat có xin lỗi tôi nên có cập nhật này sau này. Tôi đã làm cho nó hoạt động tốt ngay bây giờ. Di chuyển nó sang .NET tăng hiệu suất của ứng dụng này lên gấp 3 lần. Ngay cả những thứ xung quanh. – dko
Một liên kết bổ sung cho một bản tóm tắt của cách có thể:
- 1. Chuyển đổi char [] mảng để String
- 2. Chuyển đổi giữa SQL char và C#
- 3. Cách tốt nhất để chuyển đổi giữa hai đoạn
- 4. Cách tốt nhất để chuyển đổi IEnumerable <char> thành chuỗi?
- 5. Cách tốt nhất để chuyển mảng giữa PHP và Javascript
- 6. Chuyển đổi từ const char * để std :: string const &
- 7. Làm thế nào để chuyển đổi Platform :: String thành char *?
- 8. Cách tốt nhất để chuyển đổi từ điển <string, string> thành biểu diễn chuỗi tổng hợp duy nhất?
- 9. Chuyển đổi std :: string thành std :: vector <char>
- 10. Cách tốt nhất để chuyển đổi XMLGregorianCalendar thành MM/dd/yyyy hh: mm String là gì?
- 11. không thể chuyển đổi từ 'string' thành 'char []' cho chia
- 12. std :: di chuyển giữa std :: string và std :: vector <unsigned char>
- 13. Byte và chuyển đổi char trong Java
- 14. Sự khác biệt giữa char a [] = "string"; char * p = "chuỗi";
- 15. Chuyển đổi char để NSString
- 16. Làm thế nào để chuyển đổi Blob để String và String để Blob trong java
- 17. C char để string (đi qua char để strcat())
- 18. cách tốt nhất để chuyển đổi và xác nhận chuỗi ngày
- 19. Chuyển đổi ưu tiên từ char (không phải char *) thành tiêu chuẩn :: string
- 20. Chuyển đổi XmlDocument để String
- 21. Chuyển đổi Ada String để C Void *
- 22. C++ chuyển đổi char thành const char *
- 23. Làm thế nào để chuyển đổi std :: string để const char *?
- 24. String để char mảng Java
- 25. Chuyển đổi String để Integer
- 26. Chuyển đổi String để java.util.Date
- 27. Làm thế nào để chuyển đổi unsigned char * thành std :: string in C++?
- 28. LINQ to SQL - cách tốt nhất để chuyển đổi giữa thử nghiệm & dev db
- 29. Cách tốt nhất để chuyển đổi std :: wstring thành QString
- 30. Chuyển đổi char * để WCHAR * trong C
Cảm ơn, nhưng đó là một lời giải thích dài dòng. Điều này đi sâu vào vấn đề: '#include // marshal_context context; // my_c_string = context.marshal_as (my_csharp_string); ' –
gatopeich
Đối với những người tự hỏi, không gian tên đầy đủ cho ngữ cảnh là 'msclr :: interop :: marshal_context' – Mugen