Реализация АР1-вызовов в C#

API-вызовы — это вызовы функций операционной системы или dll-функций. Для использования API-вызовов нужно их объявить как внешние методы с помощью директивы компилятора Diiimport. Проблема использования API-вызовов упирается в необходимость согласования типов аргументов этих вызовов с типами C#. Приведем пример использования API-вызовов (листинг 3.21).

: Листинг 3.21. Пример использования API-вызовов

using System; using System.Text;

using System.Runtime.InteropServices; namespace ConsoleApplication7API

/// <summary>

/// Summary description for Classl.

/// </summa ry> class Classl

[DllImport("kernel32.dll")]

static extern bool GetComputerName(StringBuilder name, ref ulong size);

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main(string[] args)

{

//

// TODO: Add code to start application here //

ulong size=256;

StringBuilder name= new StringBuilder((int) size); bool success=GetComputerName(name, ref size);

System.Console.WriteLine(name.ToString());

System.Console.ReadLine();

}

}

}

Для использования API-вызова мы подключаем пакет:

using System.Runtime.InteropServices;

Далее включаем директиву компилятора:

[DllImport("kernel32.dll")]

Эта директива указывает, где находится интересующая нас API- функция.

Затем объявляем саму АР1-функцию:

static extern bool GetComputerName (StringBuilder name,ref ulong size);

Эта функция возвращает имя компьютера, созданное при инсталляции операционной системы.

Вызов самой функции реализуется так:

bool success=GetComputerName(name, ref size);

Более сложно реализовать передачу структур в качестве параметров API-функций. Структуру необходимо предварительно объявить. Для этого используется директива компилятора [structure- Layout]. При объявлении структуры можно указывать явно смещения полей относительно начала структуры либо неявно. Поскольку второй способ не требует знания размеров занимаемой памяти соответствующими типами данных, нам он представляется более удобным. В связи со сказанным рассмотрим иллюстрацию применения структур (листинг 3.22).

Листинг 3.22. Передача структуры в API-вызове

using System;

using System.Runtime.InteropServices; namespace ConsoleApplication6

/// <summary>

/// Summary description for Classl.

/// </summa ry>

[StructLayout(LayoutKind.Sequential)] struct SYSTEMTIME // Объявляется структура

public uint wYear; public uint wMonth; public uint wDayOfWeek; public uint wDay; public uint wHour; public uint wMinute; public uint wSecond; public uint wMilisecond;

class Classl

/// <summary>

/// The main entry point for the application.

/// </summary>

[DllImport("kernel32.dll")]

static extern void GetSystemTime( out SYSTEMTIME st); [STAThread]

static void Main(string[] args)

{

SYSTEMTIME st=new SYSTEMTIME();

GetSystemTime( out st);

Console.WriteLine("Сейчас="+ st.wHour+":"+ st.wMinute) Console.ReadLine();

}

}

}

В данном примере объявляется структура:

[StructLayout(LayoutKind.Sequential)]

Struct SYSTEMTIME {

public uint wYear; public uint wMonth; public uint wDayOfWeek; public uint wDay; public uint wHour; public uint wMinute; public uint wSecond; public uint wMilisecond;

Инструкция [StructLayout(LayoutKind.Sequential)] объяв-

ляет, что поля структуры имеют размеры, определяемые используемыми типами. Далее следует объявление метода API:

[DllImport("kernel32.dll")]

static extern void GetSystemTime( out SYSTEMTIME st);

Обратим внимание на то, что поиск метода GetSystemTime() (получения системного времени) выполняется в библиотеке kernel32.dll. Опция out указывает на то, что метод GetSystem- Time () возвращает заполненные поля структуры.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100