logo
CSharp_Prog_Guide

Идентификация функций в библиотеках dll

Идентификация функции DLL состоит из следующих элементов:

Например, задание функции MessageBox в библиотеке User32.dll определяет функцию (MessageBox) и ее расположение (User32.dll, User32, или user32). Программный интерфейс приложений Microsoft Windows (Win32 API) может содержать две версии каждой функции, обрабатывающей символы и строки: для 1-байтовых символов ANSI и для 2-байтовых символов Юникода. Если кодировка, представленная полем CharSet, не задана, по умолчанию она равна ANSI. Некоторые функции могут быть представленными более чем двумя версиями.

MessageBoxA является точкой входа ANSI для функции MessageBox, а MessageBoxW является версией для Юникода. Список имен функций в конкретной библиотеке DLL, например user32.dll, можно получить с помощью ряда средств командной строки. Например, можно использовать команду dumpbin /exports user32.dll или link /dump /exports user32.dll, чтобы получить имена функций.

Разработчик может переименовать в своем коде неуправляемую функцию. При этом новое имя должно быть сопоставлено исходной точке входа в DLL. Инструкции по переименованию неуправляемой функции DLL в исходном управляемом коде см. ниже в разделе «Задание точки входа».

Вызов неуправляемого кода позволяет разработчику управлять значительной частью операционной системы путем вызова функций из интерфейса Win32 API и других библиотек DLL. Помимо Win32 API существует множество других интерфейсов API и DLL, доступных разработчику с помощью вызова неуправляемого кода.

В следующей таблице описывается несколько часто используемых библиотек DLL в Win32 API.

DLL

Описание содержимого

GDI32.dll

Функции интерфейса графических устройств (GDI) для вывода на устройство, например для управления рисованием и шрифтами.

Kernel32.dll

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

User32.dll

Управляющие функции Windows для обработки сообщений, таймеров, меню и взаимодействия

Creating a Class to Hold DLL Functions

Wrapping a frequently used DLL function in a managed class is an effective approach to encapsulate platform functionality. Although it is not mandatory to do so in every case, providing a class wrapper is convenient because defining DLL functions can be cumbersome and error-prone. If you are programming in Visual Basic or C#, you must declare DLL functions within a class or Visual Basic module.

Within a class, you define a static method for each DLL function you want to call. The definition can include additional information, such as the character set or the calling convention used in passing method arguments; by omitting this information, you select the default settings.

Once wrapped, you can call methods on the function as you call methods on any other static function. Platform invoke handles the underlying exported function automatically.

When designing a managed class for platform invoke, consider the relationships between classes and DLL functions. For example, you can:

You can name the class and its methods as you please.