Aracılığıyla paylaş


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

Bu konu başlığında Visual C++ birlikte çalışabilirliğinin bir özelliği gösterilmektedir. Daha fazla bilgi için bkz . C++ Birlikte Çalışma Kullanma (Örtük PInvoke).

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 gerekmez.

Örnek: Yapıyı yönetilen işlevden yönetilmeyen işleve geçirme

Aşağıdaki örnek, yönetilen bir yapıdan yönetilmeyen bir işleve hem değere hem de başvuruya göre bir yapı geçirmeyi gösterir. Bu örnekteki yapı yalnızca basit, iç veri türleri içerdiğinden (bkz . Blittable ve Blittable Olmayan Türler), özel sıralama gerekmez. İşaretçiler içerenler gibi bölünebilir olmayan yapıları sıralamak için bkz . Nasıl yapılır: C++ Birlikte Çalışma Kullanarak Katıştırılmış İşaretçileri Sıralama.

// PassStruct1.cpp
// compile with: /clr

#include <stdio.h>
#include <math.h>

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

#pragma unmanaged

struct Location {
   int x;
   int y;
};

double GetDistance(Location loc1, Location loc2) {
   printf_s("[unmanaged] loc1(%d,%d)", loc1.x, loc1.y);
   printf_s(" loc2(%d,%d)\n", loc2.x, loc2.y);

   double h = loc1.x - loc2.x;
   double v = loc1.y - loc2.y;
   double dist = sqrt( pow(h,2) + pow(v,2) );

   return dist;
}

void InitLocation(Location* lp) {
   printf_s("[unmanaged] Initializing location...\n");
   lp->x = 50;
   lp->y = 50;
}

#pragma managed

int main() {
   Location loc1;
   loc1.x = 0;
   loc1.y = 0;

   Location loc2;
   loc2.x = 100;
   loc2.y = 100;

   double dist = GetDistance(loc1, loc2);
   Console::WriteLine("[managed] distance = {0}", dist);

   Location loc3;
   InitLocation(&loc3);
   Console::WriteLine("[managed] x={0} y={1}", loc3.x, loc3.y);
}

Örnek: Yapıyı yönetilmeyen işlevden yönetilen işleve geçirme

Aşağıdaki örnek, yönetilmeyen bir yapıdan yönetilen bir işleve hem değere hem de başvuruya göre bir yapı geçirmeyi gösterir. Bu örnekteki yapı yalnızca basit, iç veri türleri içerdiğinden (bkz . Blittable ve Blittable Olmayan Türler), özel bir sıralama gerekmez. İşaretçiler içerenler gibi bölünebilir olmayan yapıları sıralamak için bkz . Nasıl yapılır: C++ Birlikte Çalışma Kullanarak Katıştırılmış İşaretçileri Sıralama.

// PassStruct2.cpp
// compile with: /clr
#include <stdio.h>
#include <math.h>
using namespace System;

// native structure definition
struct Location {
   int x;
   int y;
};

#pragma managed

double GetDistance(Location loc1, Location loc2) {
   Console::Write("[managed] got loc1({0},{1})", loc1.x, loc1.y);
   Console::WriteLine(" loc2({0},{1})", loc2.x, loc2.y);

   double h = loc1.x - loc2.x;
   double v = loc1.y = loc2.y;
   double dist = sqrt( pow(h,2) + pow(v,2) );

   return dist;
}

void InitLocation(Location* lp) {
   Console::WriteLine("[managed] Initializing location...");
   lp->x = 50;
   lp->y = 50;
}

#pragma unmanaged

int UnmanagedFunc() {
   Location loc1;
   loc1.x = 0;
   loc1.y = 0;

   Location loc2;
   loc2.x = 100;
   loc2.y = 100;

   printf_s("(unmanaged) loc1=(%d,%d)", loc1.x, loc1.y);
   printf_s(" loc2=(%d,%d)\n", loc2.x, loc2.y);

   double dist = GetDistance(loc1, loc2);
   printf_s("[unmanaged] distance = %f\n", dist);

   Location loc3;
   InitLocation(&loc3);
   printf_s("[unmanaged] got x=%d y=%d\n", loc3.x, loc3.y);

    return 0;
}

#pragma managed

int main() {
   UnmanagedFunc();
}

Ayrıca bkz.

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