Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать
  1. Передача структур в функции. Создание массива структур.

В следующем примере показано определение структур Point и Rect в управляемом коде и передача типов в качестве параметра функции PtInRect в файле библиотеки User32.dll. Для функции PtInRect используется следующая неуправляемая сигнатура:

BOOL PtInRect(const RECT *lprc, POINT pt);

Обратите внимание, что структуру Rect следует передавать по ссылке, так как функция должна получить указатель на тип RECT.

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]

public struct Point {

public int x;

public int y;

}

[StructLayout(LayoutKind.Explicit)]

public struct Rect {

[FieldOffset(0)] public int left;

[FieldOffset(4)] public int top;

[FieldOffset(8)] public int right;

[FieldOffset(12)] public int bottom;

}

class Win32API {

[DllImport("User32.dll")]

public static extern bool PtInRect(ref Rect r, Point p);

}

Если для класса используется фиксированное размещение членов, их можно передавать в неуправляемую функцию DLL,. В следующем примере демонстрируется передача последовательно упорядоченных в определении членов класса MySystemTime в функцию GetSystemTime в файле User32.dll.Для функции GetSystemTime используется следующая неуправляемая сигнатура:

void GetSystemTime(SYSTEMTIME* SystemTime);

В отличие от типов значений для классов всегда используется, по крайней мере, один уровень косвенного обращения.

[StructLayout(LayoutKind.Sequential)]

public class MySystemTime {

public ushort wYear;

public ushort wMonth;

public ushort wDayOfWeek;

public ushort wDay;

public ushort wHour;

public ushort wMinute;

public ushort wSecond;

public ushort wMilliseconds;

}

class Win32API {

[DllImport("Kernel32.dll")]

public static extern void GetSystemTime(MySystemTime st);

[DllImport("user32.dll", CharSet=CharSet.Auto)]

public static extern int MessageBox(IntPtr hWnd,

string text, string caption, int options);

}

public class TestPlatformInvoke

{

public static void Main()

{

MySystemTime sysTime = new MySystemTime();

Win32API.GetSystemTime(sysTime);

string dt;

dt = "System time is: \n" +

"Year: " + sysTime.wYear + "\n" +

"Month: " + sysTime.wMonth + "\n" +

"DayOfWeek: " + sysTime.wDayOfWeek + "\n" +

"Day: " + sysTime.wDay;

Win32API.MessageBox(IntPtr.Zero, dt, "Platform Invoke Sample", 0);

}

}

У объекта ArrayList есть метод Add, позволяющий добавлять в него элементы.

Динамический массив

ArrayList spisok = new ArrayList(); elem myElem = new elem(); myElem.isn = 2387683; myElem.type = "someType"; myElem.name = "someName"; spisok.Add(myElem);

Фиксированной длины

elem [] elemArray = new elem[5]; //например, возьмем длину массива = 5 elem myElem = new elem(); myElem.isn = 2387683; myElem.type = "someType"; myElem.name = "someName"; elemArray[0] = myElem;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]