Главная » Delphi » Delphi 2006 – Управляемый и неуправляемый код

0

Код, отвечающий требованиям общеязыковой среды CLR выполнения .NET- программ и способный обращаться к ее службам, называется управляемым. Практически все профессионально сделанные .NET-приложения базируются на управляемом коде, хотя не всегда такой код будет гарантированно безопасным. При создании .NET-приложений компилятор Delphi по умолчанию генерирует управляемый код. Отметим, что в поставку Borland Development Studio 2006 также входят .NET-компиляторы С# и VB.NET. При этом имеется возможность загрузки и переноса в Delphi проектов Microsoft Visual Studio, написанных на этих двух языках. В пакет BDS 2006 входит также среда программирования на языке С++ (C++Builder), но трансляция программ, написанных на этом языке, в управляемый код сопряжена со значительными сложностями, а в ряде ситуаций невозможна. Так, например, в технологии .NET не допускается множественное наследование и введены существенные ограничения на работу с указателями. Поэтому компилятор C++Builder можно использовать лишь для создания программ Win32.

В то же время, управляемая программа для платформы .NET может вызывать и неуправляемые функции, например из библиотек DLL, подготовленных для платформы Win32. Для этого в Delphi реализован так называемый интерфейс виртуальной библиотеки ( Virtual Library Interface). Он базируется на сервисе .NET, который называется Platform Invoke (вызов платформно- зависимого кода). Этот сервис должен быть реализован в исходных текстах прямой поддержкой — описанием вызываемых функций, которое обрабатывается во время компиляции (так называемая технология DLLImport). Для этого перед заголовком функции надо указать атрибут DLLImport, а в его параметрах — название файла библиотеки DLL и название точки входа в библиотеку, что выполняется настроечным параметром EntryPoint.

[DLLImport(‘Win32lib.dll’, EntryPoint = ‘EntryCall32′)] function win32call(x: Integer): Integer; external;

Здесь функция win32call из библиотеки win321ib.dll с неуправляемым кодом, вызываемым через точку входа в библиотеку EntryCali32, становится доступной в программе для .NET.

Чтобы атрибут DLLImport стал доступен для использования в исходном коде, надо в список подключаемых модулей раздела добавить обращение к пространству имен System.Runtime.lnteropServices.

Однако интерфейс Virtual Library Interface превосходит по своему потенциалу концепцию DLLImport. С его помощью можно обходиться без атрибута DLLImport и, более того, загрузка и вызов функций из библиотек DLL становятся возможны динамически на этапе выполнения программы. Этот подход полезен, когда размер подключаемой библиотеки велик и желательно ограничиться ее динамической обработкой. Его важное отличие от подхода DLLImport заключается в ненужности задания имени DLL-файла в исходном тексте.

Для работы с этим интерфейсом надо добавить в модуль пространство имен Borland.vcl .Win32, определить пользовательский интерфейс к вызываемым функциям и вызвать функцию Supports этого пространства имен, чтобы проверить, возможно ли обратиться к прикладным функциям, описанным программистом в прикладном интерфейсе.

Для вышеприведенного примера новый вариант кода может быть таким.

uses Borland.Vcl.Win32;

type IWin32Lib = Interface

function win32call(x: Integer): Integer-

end;

Здесь мы описали интерфейс, через который во время работы программы будем обращаться к нужной библиотеке. Для этого надо воспользоваться упомянутой функцией Supports, в качестве параметров которой указываются название файла библиотеки DLL, название интерфейса и название переменной, реализующей этот интерфейс.

var

Mylnt: IWin32Lib;

if Supports(‘win321ib.dll’, IWin32Lib, Mylnt) then Write( Mylnt.win32call(12) );

Отметим, что в среде Delphi для платформы .NET сохраняется возможность вставлять в код прямые вызовы функций API Win32 (только в списке стандартных подключаемых библиотек надо указать модуль Windows). И хотя их реализация осуществляется не совсем тривиально: через технологию маршаллинга в обход вызовов, специфичных для СОМ-интерфейсов, — тем не менее с точки зрения прикладного разработчика никаких трудностей организация таких вызовов не создает.

 

Бобровский С. И. Технологии Delphi 2006. Новые возможности. — СПб.: Питер, 2006. — 288 е.: ил.

По теме:

  • Комментарии