Visual C++'ta System::String'den Char'a Dönüştürme
Bu makalede, Visual C++'da yönetilen uzantıları kullanarak'dan'a System::String*
char*
dönüştürmenin çeşitli yolları açıklanmaktadır.
Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 311259
Özet
Bu makale, aşağıdaki Microsoft .NET Framework Sınıf Kitaplığı ad alanlarını ifade eder:
System::Runtime::InteropServices
Msclr::interop
Bu makalede, aşağıdakileri kullanarak dönüştürmenin System::String*
char*
çeşitli yolları açıklanır:
- Visual C++ .NET 2002 ve Visual C++ .NET 2003'te C++ için yönetilen uzantılar
- Visual C++ 2005 ve Visual C++ 2008'de C++/CLI
Yöntem 1
PtrToStringChars
size gerçek String
nesnenin iç işaretçisini verir. Bu işaretçiyi yönetilmeyen bir işlev çağrısına geçirirseniz, nesnenin zaman uyumsuz bir çöp toplama işlemi sırasında hareket etmediğinden emin olmak için önce işaretçiyi sabitlemeniz gerekir:
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);
Yöntem 2
StringToHGlobalAnsi
yönetilen String
bir nesnenin içeriğini yerel yığına kopyalar ve ardından anında Amerikan Ulusal Standartlar Enstitüsü (ANSI) biçimine dönüştürür. Bu yöntem gerekli yerel yığın belleğini ayırır:
//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
Not
Visual C++ 2005 ve Visual C++ 2008'de, önceki kod örneğini başarıyla derlemek için ortak dil çalışma zamanı desteği derleyici seçeneğini (/clr:oldSyntax) eklemeniz gerekir. Ortak dil çalışma zamanı desteği derleyici seçeneğini eklemek için şu adımları izleyin:
Project'e ve ardından ProjectName Özellikleri'ne tıklayın.
Not
ProjectName, projenin adı için bir yer tutucudur.
Yapılandırma Özellikleri'ni genişletin ve genel'e tıklayın.
Sağ bölmede, Ortak Dil Çalışma Zamanı destek projesi ayarlarında Ortak Dil Çalışma Zamanı Desteği, Eski Söz Dizimi (/clr:oldSyntax) öğesini seçmek için tıklayın.
Uygula'yı ve ardından Tamam'ı tıklatın.
Ortak dil çalışma zamanı desteği derleyici seçenekleri hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:
/clr (Ortak Dil Çalışma Zamanı Derlemesi)
Bu adımlar makalenin tamamı için geçerlidir.
Yöntem 3
VC7 CString
sınıfı, yönetilen bir Dize işaretçisi alan ve içeriğini yükleyen bir oluşturucuya CString
sahiptir:
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);
Yöntem 4
Visual C++ 2008, marshal yardım sınıfını marshal_as<T>
ve marshal yardımcı sınıfını marshal_context()
tanıtır.
//#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;
Not
Bu kod, Visual C++ .NET 2002 veya Visual C++ .NET 2003'te C++ için yönetilen uzantılar kullanılarak derlenmez. Visual C++ 2005'te tanıtılan yeni C++/CLI söz dizimini ve Visaul C++ 2008'de kullanıma sunulan yeni msclr ad alanı kodunu kullanır. Bu kodu başarıyla derlemek için Visual C++ 2008'de /clr C++ derleyici anahtarını kullanmanız gerekir.
C++ için Yönetilen Uzantılar örnek kod (Visual C++ 2002 veya 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 örnek kodu (Visual C++ 2005 ve 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;
}
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin