Подробный обзор вызова неуправляемого кода



Для нахождения экспортируемых функций и маршалинга их аргументов во время выполнения вызов неуправляемого кода использует метаданные. Этот процесс показан на следующем рисунке.

Вызов неуправляемой функции DLL из вызова неуправляемого кода


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

1. Определяет DLL, содержащую функцию.

2. Загружает DLL в память.

3. Находит адрес функции в памяти и помещает ее аргументы в стек, осуществив в случае необходимости маршалинг данных.

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

4. Передает управление неуправляемой функции.

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

 


Identifying Functions in DLLs

The identity of a DLL function consists of the following elements:

· Function name or ordinal

· Name of the DLL file in which the implementation can be found

For example, specifying the MessageBox function in the User32.dll identifies the function (MessageBox) and its location (User32.dll, User32, or user32). The Microsoft Windows application programming interface (Win32 API) can contain two versions of each function that handles characters and strings: a 1-byte character ANSI version and a 2-byte character Unicode version. When unspecified, the character set, represented by the CharSet field, defaults to ANSI. Some functions can have more than two versions.

MessageBoxA is the ANSI entry point for the MessageBox function; MessageBoxW is the Unicode version. You can list function names for a specific DLL, such as user32.dll, by running a variety of command-line tools. For example, you can use dumpbin /exports user32.dll or link /dump /exports user32.dll to obtain function names.

You can rename an unmanaged function to whatever you like within your code as long as you map the new name to the original entry point in the DLL. For instructions on renaming an unmanaged DLL function in managed source code, see the Specifying an Entry Point.

Platform invoke enables you to control a significant portion of the operating system by calling functions in the Win32 API and other DLLs. In addition to the Win32 API, there are numerous other APIs and DLLs available to you through platform invoke.

The following table describes several commonly used DLLs in the Win32 API.

DLL Description of Contents
GDI32.dll Graphics Device Interface (GDI) functions for device output, such as those for drawing and font management.
Kernel32.dll Low-level operating system functions for memory management and resource handling.
User32.dll Windows management functions for message handling, timers, menus, and communications

 


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

Идентификация функции 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.


Дата добавления: 2019-03-09; просмотров: 249; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!