Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để chuyển đổi từ System::String * Char * trong Visual C ++

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 311259
Bài viết này đề cập đến những điều sau đây Microsoft Khuôn khổ .NET lớp thư viện không gian tên:
  • System::runtime::InteropServices
  • Msclr::interop
Tóm tắt
Bài viết này thảo luận về một số cách để chuyển đổi từ System::String * char * bằng cách sử dụng những điều sau đây:
  • Quản lý Tiện ích mở rộng trong C++ trong Microsoft Visual C++ .NET 2002 và trong Microsoft Visual C++ net 2003
  • C + +/ CLI trong Microsoft Visual C++ 2005 và trong Microsoft Visual C++ 2008

Phương pháp 1

PtrToStringChars cung cấp cho bạn một con trỏ nội thất để đối tượng String thực tế. Nếu bạn vượt qua con trỏ này nghe một cuộc gọi không được quản lý chức năng, bạn phải đầu tiên pin con trỏ để đảm bảo rằng các đối tượng không di chuyển trong một thùng rác không đồng bộ quá trình bộ sưu tập:
//#include <vcclr.h>System::String * str = S"Hello world\n";const __wchar_t __pin * str1 = PtrToStringChars(str);wprintf(str1);					

Phương pháp 2

StringToHGlobalAnsi sao chép nội dung của một đối tượng String được quản lý vào đống nguồn gốc, và sau đó chuyển đổi nó vào Mỹ quốc gia tiêu chuẩn viện (ANSI) định dạng trên bay. Phương pháp này phân bổ bộ nhớ yêu cầu bản xứ đống:
//using namespace System::Runtime::InteropServices;System::String * str = S"Hello world\n";char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);printf(str2);Marshal::FreeHGlobal(str2);				
Lưu ý Trong Visual C++ 2005 và trong Visual C++ 2008, bạn phải thêm phổ biến hỗ trợ thời gian chạy ngôn ngữ biên dịch tùy chọn (/ clr:oldSyntax) để thành công biên dịch mẫu mã trước đó.Để thêm phổ biến hỗ trợ thời gian chạy ngôn ngữ biên dịch tùy chọn, hãy làm theo các bước sau:
  1. Bấm chuột Dự án, và sau đó nhấp vào ProjectName Thuộc tính.

    Lưu ýProjectName là một giữ chỗ cho tên của dự án.
  2. Mở rộng Cấu hình thuộc tính, và sau đó nhấp vào Tổng quát.
  3. Trong ngăn phải, bấm vào để chọn Hỗ trợ ngôn ngữ chung thời gian chạy, cũ cú pháp (/ clr:oldSyntax) trong các Phổ biến thời gian chạy ngôn ngữ hỗ trợ thiết lập dự án.
  4. Bấm chuột Áp dụng, và sau đó nhấp vào Ok.
Để biết thêm chi tiết về ngôn ngữ chung thời gian chạy hỗ trợ biên dịch tùy chọn, ghé thăm Web site sau của Microsoft Developer Network (MSDN):Các bước này áp dụng cho toàn bộ bài viết.

Phương pháp 3

Các lớp học VC7 CString có một nhà xây dựng mà phải mất một con trỏ chuỗi được quản lý và tải CString với nội dung của nó:
//#include <atlstr.h>System::String * str = S"Hello world\n";CString str3(str); printf(str3);				

Phương pháp 4

Visual C++ 2008 giới thiệu các marshal_as<T> </T> nguyên soái giúp đỡ lớp và lớp helper nguyên soái marshal_context() .
//#include <msclr/marshal.h>//using namespace msclr::interop;marshal_context ^ context = gcnew marshal_context();const char* str4 = context->marshal_as<const char*>(str);puts(str4);delete context;
Lưu ý Mã này không biên dịch bằng cách sử dụng tiện ích mở rộng được quản lý cho C++ trong Visual C++ .NET 2002 hoặc trong C ++ Visual Studio.net 2003. Nó sử dụng mới c/C + +/ CLI cú pháp đã được giới thiệu trong Visual C++ 2005 và msclr không gian tên mã mới được giới thiệu trong Visaul C++ 2008. Để thành công biên dịch mã này, bạn phải sử dụng /clr C++ biên dịch chuyển trong Microsoft Visual C++ 2008.

Quản lý Tiện ích mở rộng trong C++ mẫu mã (Visual C++ 2002 hoặc Visual C++ 2003)

//compiler option: cl /clr  #include <vcclr.h>#include <atlstr.h>#include <stdio.h>#using <mscorlib.dll>using namespace System;using namespace System::Runtime::InteropServices;int _tmain(void){   	System::String * str = S"Hello world\n";	//method 1	const __wchar_t __pin * str1 = PtrToStringChars(str);	wprintf(str1);		//method 2	char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);	printf(str2);	Marshal::FreeHGlobal(str2);	//method 3	CString str3(str); 	wprintf(str3);    return 0;}				

C + +/ CLI mẫu mã (Visual C++ 2005 và Visual C++ 2008)

//compiler option: cl /clr #include <atlstr.h>#include <stdio.h>#using <mscorlib.dll>using namespace System;using namespace System::Runtime::InteropServices;#if _MSC_VER > 1499 // Visual C++ 2008 only#include <msclr/marshal.h>using namespace msclr::interop;#endif int _tmain(void){		     System::String ^ str = "Hello world\n";	     /method 1	     pin_ptr<const wchar_t> str1 = PtrToStringChars(str);     	wprintf(str1);		     //method 2	     char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();     	printf(str2);	     Marshal::FreeHGlobal((IntPtr)str2);	     //method 3	     CString str3(str); 	     wprintf(str3);     	//method 4#if _MSC_VER > 1499 // Visual C++ 2008 only	     marshal_context ^ context = gcnew marshal_context();	     const char* str4 = context->marshal_as<const char*>(str);     	puts(str4);	     delete context;#endif	return 0;}
Tham khảo
Cho khác hàng đầu-hit Visual C++ net Microsoft Knowledge Base Bài viết, hãy ghé thăm Web site sau của Microsoft:
kbVC700

Cảnh báo: Bài viết này đã được dịch tự động

Thuộc tính

ID Bài viết: 311259 - Xem lại Lần cuối: 05/30/2013 10:07:00 - Bản sửa đổi: 3.0

Microsoft Visual C++ 2008 Express Edition, Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition

  • kbhowtomaster kbmanaged kbnewsgrouplink kbmt KB311259 KbMtvi
Phản hồi