procedure МуВеер;
stdcall;
external 'MyDLL.DLL' name 'DoBeep';

Это объявление гласит, что вы импортируете из библиотеки MyDLL.DLL процедуру DoBeep и присваиваете ей имя МуВеер. Тогда в своем приложении вы должны вызывать процедуру по этому присвоенному ей имени МуВеер.

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

exports

Average(X, Y: integer) name 'Averagelnt', Average(X, Y: real) name 'AverageReal';

Конечно, в приложении можно было бы использовать эти функции под теми различающимися именами, которые даны им при экспорте. Но тогда исчезла бы прелесть перегрузки, связанная с автоматическим распознаванием вариантов по типам параметров. В приложении можно сохранить особенности этих перегруженных функций, если объявить их следующим образом:

function Average(X, Y: integer): real;
overload;
stdcall;
external 'MyDLL.DLL' name 'Averagelnt';
function Average(X, Y: real): real;
overload;
stdcall;
external 'MyDLL.DLL' name 'AverageReal';

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

В приложении можно объявлять процедуры и функции не по их экспортируемым именам, а по индексам, которые рассматривались в предыдущем разделе. Например, если при экспорте процедура DoBeep имеет индекс 1, то ее объявление в приложении может иметь вид:

procedure DoBeep;
stdcall;
external ^MyDLL.DLL' index 1;

Здесь вместо DoUeep может использоваться любое имя - то, по которому в данном приложении будет вызываться эта процедура.

В приведенных примерах подразумевалось, что файл DLL расположен в том каталоге, из которого запускается приложение, или в одном из системных каталогов Windows, или в каталоге, указанном в переменной окружения PATH. Если это не так, то в спецификации external надо указать полный путь к файлу библиотеки. Но, конечно, в этом случае приложение невозможно будет перенести на компьютер с другим расположением каталогов. Так что указание полного пути, как правило, нецелесообразно. Лучше, передавая приложение и DLL пользователю, указать, что файл DLL должен располагаться в системном каталоге. А еще лучше, если программа установки вашего приложения сама разместит файлы так, как требуется.

При запуске рассмотренного тестового приложения все будет выполняться нормально, если вы не сделали каких-то ошибок при написании DLL. Но так как сложную библиотеку, вероятно, невозможно написать, не сделав каких-то ошибок, неизбежно возникает вопрос об отладке DLL. Непосредственно выполнить файл DLL невозможно. Так что для отладки всегда требуется тестовое приложения, подобное описанному выше. Но при выполнении тестового приложения в версиях Delphi, предшествующих 2005, вы можете видеть при таком выполнении только результат работы. Вы не можете задать в коде DLL какие-то остановы и пройти код по шагам, наблюдая значения интересующих вас переменных (в Delphi 2005 и 2006 это возможно). Чтобы иметь возможность запускать на выполнение саму DLL и осуществлять ее отладку, надо сделать следующее. Активизируйте в окне Менеджера Проектов (если вы его используете) вершину библиотеки MyDLL.dll. Далее выполните команду Run | Parameters. Перед вами откроется окно, показанное на рис. 12.12 (для версий, предшествующих Delphi 2005, - рис. 12.12 а, для Delphi 2005 и 2006 - рис. 12.12 б). В этом окне надо задать Host application - полное имя выполняемого файла тестового приложения. В этом вам может помочь кнопка Browse.

12.6.3 Статическое связывание и отладка DLL в приложениях VCL Win3212.6.3 Статическое связывание и отладка DLL в приложениях VCL Win32

Рис. 12.12. Задание для DLL тестового приложения

После того как вы указали хост для вашей библиотеки, в Delphi 2005 и 2006 надо обязательно указать еще Working directory - рабочий каталог. В качестве него укажите каталог, в котором лежит модуль DLL. Теперь можете щелкнуть на ОК и закрыть диалоговое окно. Далее вы можете задать в коде библиотеки любые точки останова и запустить библиотеку на выполнение. Откроется окно указанного вами тестового приложения. А при вызове из него соответствующих процедур и функций библиотеки, будут остановы во введенных вами точках, и вы сможете отлаживать DLL как обычную программу.

12.6.2 Создание DLL Win32 || Оглавление || 12.6.4 Динамическое связывание в приложениях Win32


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Сентябрь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс