Megosztás a következőn keresztül:


Útmutató: Strukturák kezelése C++ Interop használatával

Ez a témakör a Visual C++ együttműködés egyik aspektusát mutatja be. További információ: C++ Interop (Implicit PInvoke) használata.

Az alábbi példakódok a felügyelt, nem felügyelt #pragma irányelveket használják a felügyelt és nem felügyelt függvények ugyanazon fájlban való implementálásához, de ezek a függvények ugyanúgy működnek együtt, ha külön fájlokban vannak definiálva. A csak nem felügyelt függvényeket tartalmazó fájlokat nem kell a /clr (Common Language Runtime Compilation) használatával lefordítani.

Példa: Struktúra átadása felügyeltről nem kezelt függvényre

Az alábbi példa azt mutatja be, hogy egy struktúra egy felügyelt függvényből nem felügyelt függvénybe való átengedését mutatja be érték és hivatkozás alapján egyaránt. Mivel a jelen példában szereplő struktúra csak egyszerű, belső adattípusokat tartalmaz (lásd: Blittable és Nem Blittable Types), nincs szükség speciális felügyeleti műveletre. Nem blittolható struktúrák kezeléséhez, például amelyek mutatókat tartalmaznak, lásd a következő témakört: Beágyazott mutatók kezelése C++ interoperabilitással.

// 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);
}

Példa: Struktúra átadása nem felügyeltről felügyelt függvényre

Az alábbi példa bemutatja, hogy a struktúra átadása egy nem felügyelt függvényből egy felügyelt függvénybe történhet érték vagy hivatkozás szerint egyaránt. Mivel a példában szereplő struktúra csak egyszerű, belső adattípusokat tartalmaz (lásd: Blittable és Nem Blittable Típusok), nincs szükség speciális átalakításra. Nem blittolható struktúrák kezeléséhez, például amelyek mutatókat tartalmaznak, lásd a következő témakört: Beágyazott mutatók kezelése C++ interoperabilitással.

// 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();
}

Lásd még

C++ Interop használata (Implicit PInvoke)