Aracılığıyla paylaş


Nasıl yapılır: C++ Birlikte Çalışması Kullanarak ANSI Dizelerini Sıralama

Bu konu C++ Birlikte Çalışma kullanılarak ANSI dizelerinin nasıl geçirilebileceğini gösterir, ancak .NET Framework String dizeleri Unicode biçiminde temsil eder, bu nedenle ANSI'ye dönüştürme ek bir adımdır. Diğer dize türleriyle birlikte çalışma için aşağıdaki konulara bakın:

Aşağıdaki kod örnekleri yönetilen ve yönetilmeyen işlevleri aynı dosyada uygulamak için yönetilen, yönetilmeyen #pragma yönergelerini kullanır, ancak bu işlevler ayrı dosyalarda tanımlanırsa aynı şekilde birlikte çalışır. Yalnızca yönetilmeyen işlevleri içeren dosyaların /clr (Ortak Dil Çalışma Zamanı Derlemesi) ile derlenmesi gerekmediğinden, performans özelliklerini koruyabilirler.

Örnek: ANSI dizesini geçirme

Örnekte, kullanılarak StringToHGlobalAnsiyönetilen bir ANSI dizesini yönetilmeyen bir işleve geçirme gösterilmektedir. Bu yöntem yönetilmeyen yığında bellek ayırır ve dönüştürmeyi gerçekleştirdikten sonra adresi döndürür. Bu, sabitlemenin gerekli olmadığı anlamına gelir (GC yığınındaki bellek yönetilmeyen işleve geçirilmediği için) ve döndürülen StringToHGlobalAnsi IntPtr'nin açıkça serbest bırakılması veya bellek sızıntısı sonuçları olması gerekir.

// MarshalANSI1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(const char* p) {
   printf_s("(native) received '%s'\n", p);
}

#pragma managed

int main() {
   String^ s = gcnew String("sample string");
   IntPtr ip = Marshal::StringToHGlobalAnsi(s);
   const char* str = static_cast<const char*>(ip.ToPointer());

   Console::WriteLine("(managed) passing string...");
   NativeTakesAString( str );

   Marshal::FreeHGlobal( ip );
}

Örnek: ANSI dizesine erişmek için gereken veri hazırlama

Aşağıdaki örnek, yönetilmeyen bir işlev tarafından çağrılan yönetilen bir işlevdeki ANSI dizesine erişmek için gereken veri hazırlamayı gösterir. Yerel dizeyi alırken yönetilen işlev, gösterildiği gibi doğrudan kullanabilir veya yöntemini kullanarak yönetilen dizeye PtrToStringAnsi dönüştürebilir.

// MarshalANSI2.cpp
// compile with: /clr
#include <iostream>
#include <vcclr.h>

using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedStringFunc(char* s) {
   String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
   Console::WriteLine("(managed): received '{0}'", ms);
}

#pragma unmanaged

void NativeProvidesAString() {
   cout << "(native) calling managed func...\n";
   ManagedStringFunc("test string");
}

#pragma managed

int main() {
   NativeProvidesAString();
}

Ayrıca bkz.

C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke)