Шаг 216.
Microsoft Visual C++ 2010. Язык С/С++. Преобразование между регулируемыми и нерегулируемыми указателями. Пример 5. Маршаллинг native-структуры

    На этом шаге мы приведем программу, реализующую указанное преобразование.

    В данном примере показана работа с native-структурой в managed-функции. Текст программы приведен ниже, результат - на рисунке 1.

// 216_1.cpp: главный файл проекта.

#include "stdafx.h"

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

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

#pragma unmanaged
//native-структура: 
struct Location {
	int x;
	int y;
};
//параметры функции - два экземпляра структуры:  
double GetDistance(Location loc1, Location loc2)
{
	printf("[unmanaged] loc1(%d, %d)", loc1.x, loc1.y); 
	printf(" loc2(%d, %d)\n", loc2.x, loc2.y);

	double h = loc1.x - loc2.x; 
	double v = loc1.y = loc2.y; 
	//квадратный корень из h*h + v*v:
	double dist = sqrt( pow(h, 2) + pow(v, 2) );
	return dist;
}

//параметр функции - указатель на структуру 
void InitLocation(Location* lp)
{
	printf("[unmanaged] Initializing location...\n"); 
	lp->x = 50; 
	lp->y = 50;
}
#pragma managed

//работа со стуктурой в managed-функции: 
void main()
{
	Location loc1;
	loc1.x = 0;
	loc1.y = 0;
	Location loc2; 
	loc2.x = 100; 
	loc2.y = 100;
	//вызов native-функции в managed-функции: 
	double dist = GetDistance(loc1, loc2); 
	Console::WriteLine("[managed] distance = {0}", dist);
	
	Location loc3;
	//вызов native-функции в managed-функции 
	//в ее параметре указатель, поэтому берется 
	//адрес экземпляра структур!
	InitLocation(&loc3);
	Console::WriteLine("[managed] x={0} у={1}", loc3.x, loc3.y);
	Console::ReadLine();
}
Архив проекта можно взять здесь.


Рис.1. Маршаллинг структуры

    На следующем шаге мы рассмотрим работу с массивом элементов native-структуры в managed-функции.




Предыдущий шаг Содержание Следующий шаг