1. Начните свой первый проект DLL
1.file-> Закрыть All-> file-> new [dll >
Код : |
// автоматически генерировать код следующим образом Библиотечный проект2; // это чепуха. Использование Sysutils, Классы; {$ R *.res} Начинать конец. |
2. Добавьте фанк, чтобы ввести:
Код : |
Библиотечный проект2; Использование Sysutils, Классы; Функция mymax (x, y: integer): целое число; Начинать Если x> y, то тогда Результаты: = x еще Результаты: = y; конец ; // Помните: имя библиотеки не имеет значения, но случай DLL-FUNC связан. // написание MyMax в DLL-Func-Name отличается от MyMax. Если это написано неправильно, немедленно // Результат заключается в том, что вы просите, чтобы AP, который использует этот DLL, не может быть открыт вообще. // Верхний и нижний случай параметров в порядке. Это даже не должно иметь то же имя. Если прототип есть (x, y: целое число) // Напишите это как (a, b: целое число) во времени, это нормально. // Помните: добавьте еще один stdcall. В книге говорится, что если вы пишете DLL, используя Delphi, и надеетесь не только на // Если Delphi-AP также надеется использовать BCB/VC-AP и т. Д., То вам лучше добавить STDCALL; // шаблон параметров: Delphi имеет много переменных шаблонов, которые, конечно, не то, что DLL похоже //, родной язык Windows/DLL должен быть C. Поэтому, если мы хотим передать и выходить из параметров DLL, мы // Использование как можно больше в соответствии с правилами. Если вы напишете эти два, последнее будет много проблем. Если вы не знакомы с C // Если это нормально. Мы поговорим об этом позже. {$ R *.res} Начинать конец. |
3. Отправьте эти общие функции из DLL и позвольте внешнему миру (это ваш Delphi-AP) использование: Гуанру
Следовательно, ваш AP не может использовать их, вам нужно добавить экспорт.
Код : |
{$ R *.res} экспорт Mymax; Начинать конец. |
4. Хорошо, вы можете нажать Ctrl-F9 для компиляции. Не нажимайте F9 в настоящее время. DLL - это не Exe┌, который не может быть выполнен отдельно. Если у DLL есть ошибка в настоящее время, пожалуйста, исправьте ее. Снова нажмите Ctrl-F9. Предупреждение может быть там в настоящее время, это не имеет значения, просто изучите его и посмотрите. Снова нажмите Ctrl-F9, а затем «сделано, скомпилировано». В том же каталоге будет *.dll. Поздравляю, задача выполнена.
2. Провести тест: Откройте новое приложение:
1. Добавьте Tbutton
Код : |
ShowMessage (InttoStr (MyMax (30,50))); |
2. Скажите Exe, чтобы пойти туда, чтобы поймать функцию
Код : |
// Добавить в форму, интерфейс, var Функция mymax (x, y: Integer): Integer; // mytestdll.dll записывает имя проекта DLL // Это не имеет значения, является ли имя DLL верхним и нижним. Но не забудьте добавить расширение .dll. На win95 или nt, // Нет необходимости добавлять расширение, но эти два OSS могут быть все меньше и меньше. Вам нужно добавить расширение. |
Хорошо, это просто.
Приведенный выше пример очень прост? Друзья, которые знакомы с Delphi, могут видеть, что приведенный выше код в основном такой же, как написание общей программы Delphi, за исключением того, что существует дополнительный параметр stdCall после того, как функция TestDLL и функция TestDLL объявляется с использованием оператора Exports. Просто составьте приведенный выше код, и вы можете получить библиотеку динамических ссылок под названием Delphi.dll. Теперь давайте посмотрим, что требует внимания. 1. Все функции или процедуры, записанные в DLL, должны быть добавлены с помощью параметров вызова STDCALL. В среде Delphi 1 или Delphi 2 параметр вызова далеко. После Delphi 3 этот параметр был изменен на StdCall с целью использования стандартной технологии переноса параметров WIN32 вместо оптимизированных параметров регистра. Забыл использовать параметр STDCALL - это обычная ошибка. Причина в том, что параметр регистра является параметром Delphi по умолчанию.
2. Записанные функции и процедуры должны быть объявлены как внешние функции с использованием оператора Exports.
Как видите, функция TestDLL объявляется как внешняя функция. Это позволяет увидеть функцию извне. (Если нет опции быстрого просмотра, вы можете установить его с компакт -диска Windows.) Функция TestDll появляется в панели таблицы экспорта. Еще одна веская причина в том, что если мы не объявим таким образом, функции, которые мы пишем, не будут вызваны, что никто не хочет видеть.
3. Когда используются параметры и переменные длинных типов строки, следует ссылаться на Sharemem.
Тип строки в Delphi очень мощный. (Да, вы читаете это правильно, это действительно два мегабайта.) В настоящее время, если вы настаиваете на использовании параметра типа строки, переменной или даже записи, вы должны обратиться к блоку Sharemem, и это должна быть первая ссылка Полем Это первая ссылка на единицу после оператора использования. Как показано в следующем примере:
Использование
Sharemem,
Sysutils,
Классы;
Другой момент заключается в том, что то же самое должно быть сделано в вашем файле проекта (*.dpr) вместо файла единицы (*.pas). Если вы этого не сделаете, вы, скорее всего, заплатите. Способ избежать использования типа строки состоит в том, чтобы объявить параметры, переменные и т. Д. Тип строки как pchar или shortstring (например: s: string [10]) тип. Та же самая проблема возникает, когда вы используете динамические массивы, решение, как описано выше.
Глава 3: Статический вызов DLL Top в Delphi
Называть DLL проще, чем написать DLL. Во -первых, я представлю для вас статический метод вызова. Точно так же давайте сначала приведем пример статических вызовов.
единица единицы 1;
интерфейс
Использование
Windows, сообщения, Sysutils, классы, графика,
Управления, формы, диалоги, stdctrls;
тип
Tform1 = class (tform)
РЕДАКТИРОВАТЬ1: ТЕДИТ;
Баттон1: Tbutton;
процедура Button1click (отправитель: tobject);
Частный
{Частные объявления}
публичный
{Публичные объявления}
конец;
вар
Форма1: tform1;
Выполнение
{$ R *.dfm}
// Следующий код в этой строке - код, который мы действительно написали
Function testdll (i: Integer): Integer; Stdcall;
внешний 'delphi.dll';
Процедура tform1.button1click (отправитель: tobject);
Начинать
Edit1.text: = inttoStr (testDll (1));
конец;
конец.
В приведенном выше примере мы разместили поле для редактирования (редактирование) и кнопку в форме и написали очень мало кода, чтобы проверить Delphi.dll, который мы только что написали. Вы можете видеть, что единственная задача, которую мы выполняем, - это поместить описание части функции TestDLL в реализацию и указать место Delphi.dll с внешним оператором. (В этом примере программа вызовов и delphi.dll находятся в том же каталоге.) Занимательно, что функция TestDll, которую мы сами написали сами, была быстро признана Delphi. Вы можете провести такой эксперимент: введите «testdll (», и вскоре Delphi будет использовать простую простую, чтобы застать вам, какие параметры вы должны ввести, так же просто, как и другие функции, определенные в Delphi. Примечания включают
Следующий:
1. Используйте STDCALL для вызова параметров.
Как упомянуто выше, при ссылке на функции и процедуры в DLL вы также должны использовать параметр stdCall, по той же причине, что и упомянуто выше.
2. Используйте внешний оператор, чтобы указать путь и имя вызываемого DLL -файла.
Как видите, мы указываем имя файла DLL, который будет вызван во внешнем операторе. Нет пути записи, потому что файл DLL и основная программа, которая его называла, находятся в одном каталоге. Если файл DLL находится в C:/, мы можем написать приведенный выше ссылочный оператор как внешний 'c: /delphi.dll'. Обратите внимание, что файл Suffix.dll должен быть записан.
3. Глобальные переменные не могут быть вызваны из DLL.
Если мы объявим какую -то глобальную переменную в DLL, например: var S: Byte. Таким образом, глобальная переменная S может использоваться обычно в DLL, но S не может использоваться в результате программы вызова, и S не может быть передана в качестве глобальной переменной для вызовой программы. Однако переменные, объявленные в вызовной программе, могут быть переданы в качестве параметров DLL.
4. Призванный DLL должен существовать.
Это важно. Если указанный путь и имя файла не существуют или указанный путь и имя файла неверны, система будет предложить «произошла ошибка при запуске программы» или «не найдено *.dll файл» при запуске основной программы.
Глава 4 Динамически вызов DLL Top в Delphi
Динамически вызов DLLS является относительно сложным, но очень гибким. Чтобы тщательно проиллюстрировать проблему, на этот раз мы приводим пример вызова DLL, написанного в C ++. Во -первых, составьте следующую программу источника DLL в C ++.
#включать
extern "c" _declspec (dllexport)
int winapi testc (int i)
{
вернуть я;
}
После компиляции генерируется файл DLL. Для удобства мы все еще ссылаемся на приведенную выше программу вызова, но заменим исходный оператор в процессе Button1click на следующий код.
Процедура tform1.button1click (отправитель: tobject);
тип
Tintfunc = function (i: integer): integer; stdcall;
вар
Th: Тандл;
TF: tintfunc;
TP: TFARPROC;
Начинать
Th: = loadlibrary ('cpp.dll');
Если th> 0, то
пытаться
Tp: = getProcadDress (th, pchar ('testc'));
Если tp <> nil
Тогда начните
Tf: = tintfunc (tp);
Edit1.text: = inttoStr (tf (1));
конец
еще
ShowMessage ('функция testc не найдена');
Окончательно
Freelibrary (TH);
конец
еще
Showmessage ('cpp.dll не найден');
конец;
Как вы видели, эта методика динамического вызова очень сложна, но до тех пор, пока вы изменяете параметры, такие как изменение имени DLL в LoadLibrary ('cpp.dll'), чтобы быть «delphi.dll», вы можете динамически изменить называется DLL.
1. Определите тип функции или процедуры, которая должна быть вызвана.
В приведенном выше коде мы определяем тип tintfunc, который соответствует функциональному тестированию, которую мы собираемся позвонить. Такое же определение работы должна быть выполнена в других вызовах. А также добавьте параметры вызова stdcall.
2. Отпустите называемый DLL.
Мы динамически позвонили DLL с помощью LoadLibrary, но помните, что вы должны вручную отпустить DLL с помощью Freeliabrary после использования, в противном случае DLL займет память до тех пор, пока вы не выйдете из Windows или отключите.
Теперь давайте оценим преимущества и недостатки двух методов вызова DLL. Статический метод прост в реализации, легко освоить и, как правило, немного быстрее, и более безопасен и более надежен; Запуск до тех пор, пока DLL не будет выпущен только в конце программы, и только системы, основанные на компиляторах, такие как Delphi, могут использовать этот метод. Динамические методы лучше решать недостатки статическими методами и могут легко получить доступ к функциям и процедурам в DLL, и даже вновь добавленные функции или процедуры в некоторых старых версиях DLL; Функция или процедура необходимо определить многие сложные типы и вызывные методы. Для начинающих автор рекомендует использовать статические методы, а затем использовать динамические методы вызова после того, как вы будете опытны.
Глава 5 Практические советы по использованию DLL Top
1. Навыки письма.
1. Чтобы обеспечить правильность DLL, вы можете сначала написать его как часть обычного приложения, правильно отлаживать, а затем отделить от основной программы и собрать в DLL.
2. Чтобы обеспечить универсальность DLL, вы должны предотвратить появление имен визуальных элементов управления в DLL, который вы написали сами, например: edit1 имени в Edit1.Text; Некоторая запись.
3. Чтобы облегчить отладку, каждая функция и процесс должны быть максимально короткими и кратким, и должны сопровождаться конкретными и подробными аннотациями.
4. Попробуйте финал, чтобы справиться с возможными ошибками и исключениями.
5. Ссылка как можно меньше единиц, чтобы уменьшить размер DLL, особенно не относитесь к визуальным единицам, таким как диалоги. Например, в целом мы не можем ссылаться на классы, которые могут уменьшить скомпилированный DLL примерно на 16 КБ.
2. Вызов навыков.
1. При использовании статических методов вы можете переименовать вызываемую функцию или процедуру. В примере DLL, написанном в C ++, упомянутом выше, если оператор Extern «C» будет удален, C ++ составляет некоторые странные имена функций, а оригинальная функция Testc будет названа @testc $ S и другие нелепые странные имена. Использует название C ++, искажающая технологию. Это имя функции является незаконным в Delphi, мы можем решить эту проблему так:
Переписать эталонную функцию как
Функция Testc (i: Integer): Integer; Stdcall;
внешний 'cpp.dll'; name '@testc $ s';
Функция имени переименована.
2. Вы можете поместить DLL, которые мы написали в каталоге Windows или в каталоге Windows/System. Это может написать только имя DLL, не записывая путь во внешнем операторе или в операторе LoadLibrary. Но это немного неуместно. Поместите DLL, в которые вы написали себе, это в системном каталоге!
3. Навыки отладки.
1. Мы знаем, что DLL не может быть запускаться и отлаживать шаг за шагом при написании. Существует способ сделать это, то есть настроить хост -программу в меню «Параметры». Добавьте имя хост-программы в строку приложений хоста локальной страницы, чтобы выполнить пошаговую отладку, наблюдение за точками останова и запуск.
2. Добавить информацию о версии DLL. В начальных замечаниях упоминается, что информация о версии очень важна для DLL. Стоит добавить такое немного места. К сожалению, невозможно использовать опцию версии в меню «Опции». Как показано в следующем примере:
Библиотека Delphi;
Использование
Sysutils,
Классы;
{$ R *.res}
// Обратите внимание, что вышеуказанная строка кода должна быть добавлена в эту позицию
Function testdll (i: Integer): Integer; Stdcall;
Начинать
Результаты: = i;
конец;
экспорт
Testdll;
Начинать
конец.
3. Чтобы избежать дублирования имен с другими DLL, лучше всего использовать сочетание символов, чисел и подчеркивания при названии DLL, которые вы пишете. Например: jl_try16.dll.
4. Если вы уже собрали несколько DLL в Delphi 1 или Delphi 2, DLL, который вы скомпилированы, составляют 16-битный. Просто перекомпилируйте исходный код в новой среде Delphi 3 или Delphi 4, и вы можете получить 32-битный DLL.
[После примечания]: В дополнение к наиболее часто используемым методам использования DLL, представленных выше, DLL также можно использовать в качестве носителей ресурсов. Например, изменение значков в Windows является ресурсом в используемом DLL. Кроме того, обладая освоением технологии проектирования DLL имеет много преимуществ для использования более продвинутых программирования OLE, COM и ActiveX.