Создание Dll обычно делится на следующие этапы:
1. Напишите процедуру или функцию в проекте DLL.
2. Введите ключевое слово «Экспорт» и напишите под ним имя процедуры. Нет необходимости писать параметры и суффиксы вызова.
Передано два параметра
1 Тип параметра должен соответствовать типу параметра окна C++. Не используйте тип данных DELPHI.
2 Лучше всего иметь возвращаемое значение [даже если это процедура], чтобы сообщить об успехе или неудаче вызова или о статусе. Возвращаемое значение успеха или неудачи предпочтительно равно 1 [успех] или 0 [неудача]. Одним словом, оно совместимо с Windows C++.
3 Объявите суффикс с помощью stdcall.
4 Предпочтительно с учетом регистра.
5 Нет необходимости использовать суффикс дальнего вызова, он нужен только для совместимости с 16-битными программами Windows.
Инициализация и очистка при выходе трех DLL [если требуется инициализация и очистка при выходе]
1 DLLPROc [указатель модуля SysUtils] — это вход в DLL. Здесь вы можете заменить его запись своей функцией. Но ваша функция должна соответствовать следующим требованиям [фактически функция обратного вызова]. следующее:
процедура DllEnterPoint(dwReason: DWord);far;stdcall;
Существует четыре типа параметров dwReason:
DLL_PROCESS_ATTACH: Когда процесс входит
DLL_PROCESS_DETACH при выходе из процесса
DLL_THREAD_ATTACH при входе потока
DLL_THREAD_DETACH при выходе из потока
В разделе инициализации напишите:
DLLProc := @DLLEnterPoint;
DllEnterPoint (DLL_PROCESS_ATTACH);
2 Если на форме есть компонент TdcomConnection, используйте Uses Activex и во время инициализации напишите CoInitialize (nil);
3. Убедитесь, что DcomConnection.Connected := False при выходе и набор данных закрыт. В противном случае указанный адрес неверен.
Использование четырех глобальных переменных
В 32-битной программе Widnows адресные пространства двух приложений не связаны друг с другом. Хотя DLL является копией в памяти, переменные находятся в адресном пространстве каждого процесса, поэтому вы не можете использовать глобальные переменные dll для передачи данных между двумя приложениями, если не используете файл образа памяти.
5. Вызов статической загрузки
1 Объявление функции клиента:
1) С учетом регистра.
2) То же, что и объявление в DLL.
Например: showform(form:Tform);Far;external'yproject_dll.dll';
3) Тип параметра, передаваемый при вызове, должен быть таким же, как в Windows C++.
4) При вызове DLL должна находиться в пути поиска Windows. Порядок: текущий каталог; путь windows/system32;
Шесть вызовов динамической загрузки
1. Создайте тип процедуры. [Если вы понимаете, что переменная типа процедуры является просто указателем, вы поймете, что происходит]. нравиться:
тип
mypointer=procedure(form:Tform);Far;external;
вар
Подсказка: Ручка;
шоуформа: мойуказатель;
начинать
Hinst:=loadlibrary('yproject_dll');//Загрузите Dll и найдите ее по имени файла.
showform:=getprocaddress(Hinst,'showform');//Найти по имени функции, с учетом регистра. Это понятно, если знать природу объектов автоматизации.
showform(application.mainform);//Вызывается при обнаружении указателя на вход в функцию.
Бесплатная библиотека (Хинст);
конец;
7. Создайте TForM в DLL.
1 Использует вашу форму в Dll, и связанные модули, используемые вашей формой, также должны быть использованы в [Это самый неприятный момент, поскольку ваша форма может использовать множество специальных модулей или функций]
2. Передайте параметр приложения и используйте его для создания формы.
8. Создайте TMDIChildForM в DLL.
1 MDIForm.FormStyle в Dll не обязательно должен быть fmMDIChild.
2. Напишите следующие два предложения после CreateForm:
функция ShowForm(mainForm:TForm):integer;stdcall
вар
Форма1: ТФорм1;
ПТР: PLongInt;
начинать
ptr:=@(Application.MainForm);//Сначала сохраните дескриптор MainForm dll, его не нужно освобождать, просто замените его
ptr^:=LongInt(mainForm);//Заменяем MainForm DLL на mainForm вызывающей программы. MainForm — это специальное ОКНО, которое специально управляет ресурсами форм в приложении.
//Почему бы не напрямую Application.MainForm := mainForm, потому что Application.MainForm — свойство, доступное только для чтения
Form1:=TForm1.Create(mainForm);//Создать с параметрами
конец;
Примечание. Параметром является Application.MainForm вызывающей программы.
Девять примеров:
Исходный код DLL:
библиотека Проект2;
использует
СисУтилс,
Классы,
Диалоги,
Формы,
Unit2 в «Unit2.pas» {Form2};
{$R *.RES}
вар
ксс:Пчар;
процедура OpenForm(mainForm:TForm);stdcall;
вар
Форма1: ТФорм1;
ПТР: PLongInt;
начинать
ptr:=@(Application.MainForm);
ptr^:=LongInt(mainForm);
Форма1:=TForm1.Create(mainForm);
конец;
процедура InputCCC(Text: Pchar);stdcall;
начинать
ссс := Текст;
конец;
процедура ShowCCC;stdcall;
начинать
ShowMessage(String(ccc));
конец;
экспорт
ОпенФорм;
ВводCCC,
ПоказатьCCC;
начинать
конец.
Исходный код звонящего:
блок Unit1;
интерфейс
использует
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги,
Стдктрлс;
тип
ТФорм1 = класс (ТФорма)
Кнопка1: Кнопка T;
Кнопка2: Кнопка T;
Edit1: TEdit;
процедура Button1Click (Отправитель: TObject);
процедура Button2Click (Отправитель: TObject);
частный
{Частные заявления}
общественный
{Публичные заявления}
конец;
вар
Форма1: ТФорм1;
выполнение
{$R *.DFM}
процедура OpenForm(mainForm:TForm);stdcall;External'project2.dll';
процедура ShowCCC;stdcall;External'project2.dll';
процедура InputCCC(Text: Pchar);stdcall;External'project2.dll';
процедура TForm1.Button1Click(Отправитель: TObject);
вар
Текст: Пчар;
начинать
Текст := Pchar(Edit1.Text);
// OpenForm(Application.MainForm);//Чтобы настроить MDICHILD
InputCCC(Text);//Чтобы поэкспериментировать, используются ли глобальные переменные в DLL различными приложениями
конец;
процедура TForm1.Button2Click(Отправитель: TObject);
начинать
ShowCCC;//Это показывает, что глобальные переменные в DLL 32-битного приложения WINDOWS также находятся в адресном пространстве приложения. 16-битное приложение может быть другим, и никаких экспериментов не проводилось.
конец;